【发布时间】:2014-07-23 05:21:40
【问题描述】:
这是来自GNU C reference manual Pg 74 的一段代码:
如果您的代码使用有符号循环索引,请确保该索引不能 溢出,以及从索引派生的所有有符号表达式。 这是一个有问题的代码的人为示例,其中有两个实例 溢出。
for( i = INT_MAX - 10 ; i <= INT_MAX; i++)
if( i+1 < 0 ) //first overflow
{
report_overflow();
break;
}
由于这两个溢出,编译器可能会优化掉或 以不兼容的方式转换两个比较 环绕假设。
【问题讨论】:
-
你能解释一下你的问题吗?
-
第二个可能是
i <= INT_MAX; i++ -
i <= INT_MAX始终为真,因此循环永远无法退出 -
我觉得写成只会发生一次溢出。由于
break语句,来自i++的第二个不能发生。同意吗? -
是的,但编译器可能会将其视为潜在的溢出,这可能会导致优化问题。
标签: c