C++新手编写的while循环程序为何出现无限输出?
问题分析
你的代码如下:
int main() { int i = 12; while (i > 10) { cout << i; i++; } return 0; }
导致程序持续运行的核心原因有两点:
有符号整数溢出属于未定义行为
C++标准明确规定,有符号整数(如int)溢出后的行为是未定义的。编译器可以基于“溢出永远不会发生”的假设做优化——既然i从12开始每次自增1,逻辑上只会越来越大,永远满足i>10的条件,因此直接将循环优化为无限循环,根本不会执行到i达到最大值的环节。未优化情况下,溢出前的输出量极大
即便编译器未做优化,int从12增长到最大值2147483647需要输出超过20亿个数字,这个过程耗时极长,看起来和无限运行无异,你可能还没等到溢出发生就误以为程序不会终止。而溢出后,i会变为-2147483648(int的最小值),此时i>10不成立,循环才会终止,但这个过程几乎无法等待到。
如果要避免这类问题,要么改用无符号整数(unsigned int,其溢出行为是明确的回绕到0),要么在循环条件中增加上限判断,比如while (i > 10 && i < INT_MAX)。
内容的提问来源于stack exchange,提问作者noctite
相关产品推荐
相关产品推荐

