在导致未定义行为的行之前,程序是否定义正确?

时间:2018-09-10 09:18:39

标签: c undefined-behavior

考虑以下代码:

int main()
{
    printf("Hello World!\n");
    int i;
    i = i++ + ++i; // UB
}

此代码是否可以保证打印“ Hello World!”?最后一行调用未定义的行为,但这会使整个程序无效吗?

  

我找到了this,但是这个问题是关于C ++的。这是关于C的。

     

这不是Undefined behavior and sequence points的复制,因为它是C ++。答案可能相同也可能不同,但是这个问题是关于C的。

1 个答案:

答案 0 :(得分:6)

根据C标准(3.4.3):

  

未定义的行为

     行为,在使用不可移植或错误的程序构造或错误的数据时,   本国际标准对此不施加任何要求

后跟:

  

注意可能的不确定行为范围包括完全不可预测地完全忽略情况   结果,在翻译或程序执行过程中表现为   环境(带有或不带有诊断消息)终止翻译或   执行(带有诊断消息的发布)。

这意味着该标准不对整个程序的行为(包括“较早的”操作)施加任何保证。

但是,特定的实现可能为某些未定义行为的实例添加某些保证(例如,请咨询编译器文档)。而且,in practice的许多实现在大多数情况下确实按照您描述的方式运行。优化往往使这一点难以保证。此外,compilers sometimes eliminate entire branches if they contain undefined behavior