//看似死循环的背后,隐藏的是符号整型的陷阱,其实我们需要从理论上证实这一点 //这不是一个死循环 #include<iostream> using namespace std; int main() { int x; int y=0; for(x=0;x<10;x++) { y=y+x;//x累加到4的时候,程序没有达到10,与此同时,检测到y即将大于10,x相互抵消,维持原值 //导致死循环,但是居然程序能结束,太神奇了。 if(y>10) x--; } return 0; }
int main() { int x ; int y=0;;//默认等价于符号整型 signed int 最大值是2147483647,最小值是一个负值 -2147483647 for(x=0;x<10;x++) { y=y+x;//当y一直增加到最大值是2147483647,y再次增加将会变成一个负值,此时经过累加之后,x将会达到10退出循环,所以如果是一 个死循环的话,应该是一个无符号整型y if(y>10) x--; } cout<<"x="<<x<<" y="<<y<<endl; return 0; } 结果: x=10 y=-2147483616
如下是整个演算的过程:
准备知识:
1)int 默认是符号整型,最大值:2147483647
2)符号整型的最小值是:-2147483648
整个过程类似如下:
x 0 1 2 3 4 5 5 5 5 5...............6 7 8 9 10
y 0 1 3 6 10 15 20 25 30
从上面可以看出从5开始不断的加5,一直到整数的2147483645,这个时候加5就会变成负值-2147483646, 6的时候:40 7的时候,33 8的时候,25 9的时候,16
时间: 2024-11-09 06:17:19