c - 程序会遇到未定义的行为吗?
问题描述
看下面的代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int i = 2;
srand(time(NULL));
if (rand() % 2 == 0)
i = i++ + 2;
printf("%d", i);
}
现在,有时这个程序的输出是2
,而有时它是4
——(现在,这个值4
取决于编译器,并且在不同的编译器上的值不同,前提是未定义的语句 i = i++ + 2;
被执行)——在两者中都发出警告案件。因此,当我得到输出时,编译器不会执行该2
语句。i = i++ + 2;
那么我的程序在这种情况下是否也会遇到未定义的行为,即使由于编译器(GCC,在我的情况下)发出警告而没有执行该语句?
解决方案
如果有意义的话,未定义的行为发生在运行时,而不是静态代码级别。
如果您的程序中有一个有效路径和一个无效路径,就像在您的示例中一样,如果在任何时候它采用无效路径,程序的整个执行都是 UB。
因此,如果您从不执行无效语句,那么您已经定义了行为。
注意:我使用“无效代码”来表示会导致 UB 的代码
推荐阅读
- google-cloud-platform - 如何在具有或条件的数据存储中使用 gql 获取多个实体
- vue.js - v-select : 不能显示选中的元素
- unit-testing - 测试失败时输出附加信息
- angular - 导入 Angular 材质模块时出错
- c - 保持 OCaml 值在堆外永远存在/故意泄漏 OCaml 值
- python-3.x - 尝试管理数组 Python
- mysql - 选择每个对话的最新消息
- c - 如何使用 WinSock2 在 C 中为客户端设置 IP 地址
- wordpress - 如何在 Wordpress 上的站点之间传输插件
- facebook-graph-api - Graph API 中的页面缺少连接的 Instagram 帐户字段