【发布时间】:2019-03-22 10:54:02
【问题描述】:
我是从 Facebook 帖子中得到的。这里发生了什么事?查看 ideone 中的输出。输出超过10行。
代码:
#include<iostream>
using namespace std;
int main()
{
for (int i = 0; i < 10; ++i)
cout << i*1000000000 << endl;
}
【问题讨论】:
-
你甚至用
overflow标记了它。9*1000000000不再适合int,这会导致溢出,这是未定义的行为。 -
为什么不能将输出复制粘贴到您的问题中?为什么你认为这是错误的或UB?请阅读how to ask good questions,以及this question checklist。
-
可能是编译器逻辑:“由于
3 * 1000000000溢出,我们可以假设i < 3。因此i < 10总是正确的。” -
对于 16 位 int,
3 * 1000000000将在i == 1时溢出。因此编译器可以假设i始终为零,并且条件i < 10始终为真。对于 32 位int,编译器可以假定为i < 3。对于 64 位int,循环只会运行十次。