【发布时间】:2011-12-10 08:10:03
【问题描述】:
#include<stdio.h>
int main(void)
{
int i=5;
printf("%d", i++ + ++i);
return 0;
}
我知道这是未定义的行为(或已定义的实现),不应使用。但是编译器确实给出了一个输出而没有给出任何警告。那么有没有可以预测程序的输出呢?
【问题讨论】:
-
如果“预测未定义的行为”是指“它可以做任何事情”。那么是的。
-
我认为这就是我们称之为未定义行为的部分原因......这可能并不容易预测,尤其是从一般的角度来看。
-
当然,通过了解具体实现版本的内部,将环境、标志和其他设置考虑在内。
-
@PlatinumAzure,实际上不可能静态预测 UB - 考虑
void foo() { int *p = NULL; runTuringMachine(); *p = 1; }。如果runTuringMachine()停止,我们有未定义的行为;否则我们不会。因此解决UB是否存在的问题需要解决停机问题,这是不可能的。当然在现实中runTuringMachine()可能会填写p的值... -
什么?这太荒谬了——你可以证明调用任何两个操作是合理的,其中一些操作由于停止问题而无法预测。未定义的行为通常以声明性、上下文无关的方式解释:分配给空指针地址是未定义的行为,无论它是否被执行。它仍然会有未定义的行为;这取决于正在执行的代码,这首先是 behavior 定义的一部分。