循环到什么时候会把整型溢出变为非定义行为(undefined behavior)。

0 投票
最新提问 2月 28 分类:JavaScript | 用户: 彩虹 (120 分)
#include <stdio.h>
int main()
{
    int a = 0;
    for (int i = 0; i < 3; i++)
    {
        printf("Hello\n");
        a = a + 1000000000;
    }
}

我的平台会报程序里包含未定义的行为,因为在第三次循环的时候,a会溢出。

是这个原因吗?还是要溢出后才会报这个错?编译器能事先算出这个溢出,从而提前把整个循环都定义成“未定义的行为”吗?甚至连前面的打印结果也不跑了吗?

1个回答

0 投票
最新回答 2月 28 用户: 云在飞 (300 分)

纯理论来说,c + + 标准允许未定义的行为"时间旅行",标准里是这么说的︰

[intro.execution]/5:当一个符合标准的实现执行一个良好形式的程序时,其产生的可观察行为,应该与该实现的抽象机器对应实例依据同一程序和同一输出产生的可能执行序列之一一致。尽管如此,如果在这个执行序列中包含未定义行为,本国际标准仍不会对实现以这个输入数据的这个程序的执行(不包括对第一个未定义操作之前的操作)作任何规范。

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

欢迎来到编程助手,编程方面有什么不懂的问题可以尽管在这里提问,你将会收到热心爱好者的回答。
...