在C语言中,像for (;;);
这样的无限循环是否属于未定义行为?(在C++中是这样的。,但我不确定C语言是否也一样。)
在C语言中,像for (;;);
这样的无限循环是否属于未定义行为?(在C++中是这样的。,但我不确定C语言是否也一样。)
for (;;)
语句的行为是被定义明确的。
N1570,该文件与官方2011 ISO C标准基本相同,在第6.8.5段第6个自然段中指出:for (;;)
的控制表达式被视为具有常量控制表达式的处理方式。while(1);
会被视为未定义行为呢?难道不应该适用相同的推理吗? - user541686针对C++的这个问题的原理与C无关。5.1.2.3p6节规定了优化的限制之一:
在程序终止时,写入文件的所有数据必须与根据抽象语义执行程序产生的结果相同。
现在问题变成了“根据抽象语义执行会产生什么数据?”假设一个信号中断了循环,程序可能会终止。然而,在此之前,抽象语义不会产生任何输出。如果有的话,编译器可能会优化掉puts("Hello");
。
puts("Hello");
的程序被编译并执行,使用 kill
发送信号让程序退出,程序通过从信号处理程序调用 exit 来优雅地退出。@Deduplicator,哪里有 UB?据我所知,信号中唯一的 UB 是如果程序从与计算错误对应的信号之一返回。然而,在这里不是这种情况,因为信号处理程序调用 exit,而不是返回。请确保你的事实准确无误。 - autisticexit
执行退出处理程序和其他一些事情,这些事情并不能保证完全正常工作。 - Deduplicatorputs("Hello");
,因为其中一个atexit处理程序中可能存在未定义的行为吗?在atexit处理程序中出现未定义的行为的后果是...未定义的。这如何阻止此优化发生呢? - autistic