考虑以下陈述:
*((char*)NULL) = 0; //undefined behavior
这显然引起了未定义行为。在给定的程序中存在这样一个语句是否意味着整个程序是未定义的,或者只有当控制流碰到这个语句时,行为才会变得未定义?
如果用户从来不输入数字 3
,下面的程序是否定义良好?
while (true) {
int num = ReadNumberFromConsole();
if (num == 3)
*((char*)NULL) = 0; //undefined behavior
}
或者不管用户输入什么都是完全没有未定义行为的?
此外,编译器是否可以假设未定义行为永远不会在运行时执行?这样就可以回溯时间推理:
int num = ReadNumberFromConsole();
if (num == 3) {
PrintToConsole(num);
*((char*)NULL) = 0; //undefined behavior
}
在这里,编译器可以推断,在 num == 3
的情况下,我们总是会调用未定义行为。因此,这种情况下必须是不可能的,数字不需要打印。可以优化整个 if
语句。这种反向推理是否符合标准?