【发布时间】:2021-05-28 18:05:54
【问题描述】:
我正在学习未定义的行为,并在没有任何明确解释的情况下偶然发现了这段代码:
#include <stdio.h>
#include <limits.h>
int foo ( int x) {
printf ("% d\n" , x ); //2147483647
printf ("% d\n" , x+1 ); //-2147483648 overflow
return ( x+1 ) > x ; // 1 but How????
}
int main ( void ) {
printf ("% d\n" , INT_MAX ); //2147483647
printf ("% d\n" , INT_MAX+1 ); //-2147483648 overflow
printf ("% d\n" , ( INT_MAX+1 ) > INT_MAX ); //0 makes sense, since -ve < +ve
printf ("% d\n" , foo(INT_MAX) ); //1
return 0;
}
在 gcc 上编译时,编译器发出警告:
警告:“int”类型表达式中的整数溢出导致“-2147483648”
所以,INT_MAX+1 的值显然是负数,这就解释了为什么 (INT_MAX+1) > INT_MAX 的计算结果为 0。
但是,对于foo(...) 中的x = INT_MAX,为什么(或如何)(x+1) > x 评估为 1?
【问题讨论】:
-
MAX_INT是在哪里定义的,它的定义是什么? -
@ScottHunter 在 limits.h 标头内。我用相同的方式更新了代码
-
不,不是。
INT_MAX,你反复使用的就是。 -
这是未定义行为这一事实让编译器在打开优化时将
(x + 1) > x替换为true(并且如果x是有符号整数类型或具有较低整数类型的整数类型)排名高于int) -
因为未定义的行为。
标签: c++ c undefined-behavior