考虑以下代码:
int main()
{
printf("Hello World!\n");
int i;
i = i++ + ++i; // UB
}
此代码是否可以保证打印“ Hello World!”?最后一行调用未定义的行为,但这会使整个程序无效吗?
我找到了this,但是这个问题是关于C ++的。这是关于C的。
这不是Undefined behavior and sequence points的复制,因为它是C ++。答案可能相同也可能不同,但是这个问题是关于C的。
答案 0 :(得分:6)
根据C标准(3.4.3):
未定义的行为
行为,在使用不可移植或错误的程序构造或错误的数据时, 本国际标准对此不施加任何要求
后跟:
注意可能的不确定行为范围包括完全不可预测地完全忽略情况 结果,在翻译或程序执行过程中表现为 环境(带有或不带有诊断消息)终止翻译或 执行(带有诊断消息的发布)。
这意味着该标准不对整个程序的行为(包括“较早的”操作)施加任何保证。
但是,特定的实现可能为某些未定义行为的实例添加某些保证(例如,请咨询编译器文档)。而且,in practice的许多实现在大多数情况下确实按照您描述的方式运行。优化往往使这一点难以保证。此外,compilers sometimes eliminate entire branches if they contain undefined behavior。