C - 使用将超过其类型的最大值的索引/计数器进行循环



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

int k;
for(k=INT_MAX; k< LONG_MAX; k++){
    printf("%dn",k);
}

k是类型为"int"的变量。INT_MAX是可赋给有符号整型的最大正整数值。如果您使用的编译器实现中"long"one_answers"int"的大小相同,则"k <LONG_MAX"永远不会为真,代码也永远不会打印任何东西。但是,如果在编译器实现中"long"大于"int",则增加k将溢出,从而调用未定义行为*。如果这不会导致陷阱或其他信号,典型的效果将是值包装为负(给它的值0>当然比LONG_MAX要小,k++将k的值设置为0 - INT_MAX。以此类推,无限循环。(当然,在按CTRL-C之前)

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

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

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

最新更新