0

所以,我正在尝试这段代码。它没有输出或任何警告消息。我想知道 gcc 编译器在下面做什么?

int k;
for(k=INT_MAX; k< LONG_MAX; k++){
    printf("%d\n",k);
}
4

2 回答 2

2

k 是“int”类型的变量。INT_MAX 是可以分配给有符号整数的最大正整数值。如果您正在使用“long”和“int”大小相同的编译器实现,则“k < LONG_MAX”将永远不会为真,并且代码将永远不会打印任何内容。但是,如果在您的编译器实现中“long”大于“int”,则递增 k 将溢出,调用未定义行为*。如果这不会导致陷阱或其他信号,则典型的效果是该值回绕为负数(将其值设为 0 - MAX_INT - 1)。因此,第一次循环时,代码将打印 INT_MAX 的值,k 将比较小于 LONG_MAX,k++ 将 k 的值设置为 0 - INT_MAX - 1。第二次通过,代码将打印,比较小于 LONG_MAX,k++ 会将 k 的值设置为 0 - INT_MAX。以此类推,以此类推,无限循环。(当然,直到你按下 CTRL-C。)

*未定义的行为:不好。请参阅https://www.securecoding.cert.org/confluence/display/seccode/INT32-C.+Ensure+that+operations+on+signed+integers+do+not+result+in+overflow(在许多其他地方) 了解为什么可能需要避免这种情况。

于 2013-04-23T03:49:19.220 回答
0

LONG_MAX 会像整数一样溢出。显然,这个溢出值不会大于最大可能的 INT 值,因此初始检查将失败。因此,不会打印任何内容。

我认为 gcc 编译器在这种情况下不会做出任何特别有趣的改变。

于 2013-04-23T03:34:19.110 回答