-2 c++
我只是写这段代码,但我不知道它是如何工作的。
为什么价值k会是负数?怎么样?
#include<iostream>
using namespace std;
int main()
{
int k=1,j=0;
while(k>j)
{
j=k;
k++;
}
cout<<j<<"\n"<<k;
}
Run Code Online (Sandbox Code Playgroud)
它显示了整数的范围
int范围有限。有时会k++超出此限制。此后,行为是不确定的,任何事情都会发生。
如果编译器非常保守,则它将简单地溢出到负值(特别是在int2的补码几乎无处不在的情况下),但这不能保证。在这种情况下,while循环将终止。
查看gcc在进行优化和不进行优化时的作用。根据标准,这两种行为都是合法的,因为未定义已签名的溢出行为。
使用优化(无限循环):
main:
.L2:
jmp .L2
Run Code Online (Sandbox Code Playgroud)
未经优化:打印:
2147483647
-2147483648
Run Code Online (Sandbox Code Playgroud)
同样,不仅以上两种行为,任何事情都可能发生。签名溢出未定义。