我的书说这个程序将无限期地循环运行,但编译器只进行了有限次数

Sim*_*mon -1 c

这是使用while循环的程序,

#include <stdio.h>

int main()
{
   int i;
   i = 1;
   while (i <= 32767)
   {
       printf("%d", i);
       i = i + 1;
   }
}
Run Code Online (Sandbox Code Playgroud)

你认为循环会无限期地执行吗?

use*_*738 5

那么它是有符号整数.考虑到如果int是16位,当值为INT_MAX或时,它将在一个点处精确溢出32767.那时它是未定义的行为.

它是未定义的行为 - 当int为16位时.由于行为未定义,我们不能说在这种情况下它总会无限运行等.

在您的系统中,如果int32位或更高位,则此程序的行为不是 未定义的.

标准

...... 它们的实现定义值的大小(绝对值)应等于或大于显示的值,并带有相同的符号.

在您的情况下,如果sizeof(int) = 4或更高,循环将停止.知道行为是否未定义的唯一方法是知道大小int是多少.

总结一下

  • 如果int是32位或更高,那么这将停止.
  • 如果int是16位,那么这将是未定义的行为.它可能无限循环,也可能不循环.它没有被标准定义.

  • @Simon:代码没有说"停止在32767."它说"如果`i` <= 32767则继续."为了使该测试为假,必须首先将`i`增加到大于32767. `int`不能代表32768,这是不可能的,增加超过32767的`i`有未定义的行为. (3认同)