所以,我正在尝试这段代码。它没有输出或任何警告消息。我想知道gcc编译器在底下做了什么?
int k;
for(k=INT_MAX; k< LONG_MAX; k++){
printf("%d\n",k);
}
答案 0 :(得分:2)
k是“int”类型的变量。 INT_MAX是可以分配给signed int的最大正整数值。如果您使用的编译器实现中“long”和“int”的大小相同,则“k&lt; LONG_MAX”将永远不会成立,并且代码将永远不会打印任何内容。但是,如果编译器实现中的“long”大于“int”,则递增k将溢出,调用Undefined Behavior *。如果这不会导致陷阱或其他信号,典型的效果将是值包装为负值(给它值0 - MAX_INT - 1)。因此,第一次通过循环时,代码将打印INT_MAX的值,k将比LONG_MAX小,而k ++将k的值设置为0 - INT_MAX - 1.第二次,代码将打印出来,k 当然比小于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(以及许多其他地方),了解为什么可能需要避免这种情况。
答案 1 :(得分:0)
LONG_MAX将溢出,就好像它是一个整数。显然,这个溢出值不会大于最大可能的INT值,因此初始检查将失败。因此,什么也没有印刷。
我不认为gcc编译器在这种情况下会做出任何特别有趣的改变。