c – 在循环中什么时候整数溢出成为未定义的行为?

这是一个例子来说明我的问题,涉及一些更复杂的代码,我不能在这里张贴。

#include <stdio.h>
int main()
{
    int a = 0;
    for (int i = 0; i < 3; i++)
    {
        printf("Hello\n");
        a = a + 1000000000;
    }
}

这个程序包含我的平台上的未定义的行为,因为在第3个循环将溢出。

这是否使整个程序有未定义的行为,或者只有在溢出实际发生后?编译器可能会工作出一个会溢出,所以它可以声明整个循环未定义,不打扰运行printfs,即使他们都发生在溢出之前?

(标记为C和C虽然是不同的,因为我会感兴趣的两种语言的答案,如果他们不同)。

如果你对一个纯理论的答案感兴趣,C标准允许未定义的行为“时间旅行”:

[intro.execution]/5:
A conforming implementation executing a well-formed program shall produce the same observable behavior
as one of the possible executions of the corresponding instance of the abstract machine with the same program
and the same input. However, if any such execution contains an undefined operation, this International
Standard places no requirement on the implementation executing that program with that input (not even with regard to operations preceding the first undefined operation)

因此,如果你的程序包含未定义的行为,那么整个程序的行为是未定义的。

http://stackoverflow.com/questions/39914788/at-what-point-in-the-loop-does-integer-overflow-become-undefined-behavior

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 在循环中什么时候整数溢出成为未定义的行为?