以下代码在调试模式和发布模式下(使用Visual Studio 2008)生成不同的结果:
int _tmain(int argc, _TCHAR* argv[])
{
for( int i = 0; i < 17; i++ )
{
int result = i * 16;
if( result > 255 )
{
result = 255;
}
printf("i:%2d, result = %3d\n", i, result) ;
}
return 0;
}
调试模式的输出,如预期的那样:
i: 0, result = 0
i: 1, result = 16
(...)
i:14, result = 224
i:15, result = 240
i:16, result = 255
释放模式的输出,其中i:15结果不正确:
i: 0, result = 0
i: 1, result = 16
(...)
i:14, result = 224
i:15, result = 255
i:16, result = 255
通过在发布模式下的Visual Studio中选择“优化->不优化”,输出结果将是正确的。但是,我想知道为什么优化过程可能导致错误的输出。
更新:
正如Mohit JainBy所建议的那样,打印:
printf("i:%2d, result = %3d, i*16=%d\n", i, result, i*16) ;
释放模式输出正确:
i: 0, result = 0, i*16=0
i: 1, result = 16, i*16=16
(...)
i:14, result = 224, i*16=224
i:15, result = 240, i*16=240
i:16, result = 255, i*16=256
15
这看起来像是一个编译器错误(也是一个相当重要的错误)。
—
WhozCraig
@WhozCraig只更新
—
罗里斯·林2015年
i * 16
帖子中的输出,结果是正确的。
@juanchopanza:从我对MS和VS的错误修正的经验来看,他们在得知错误后会修复此类错误,但不要将这些修正应用于较旧的VS,因此,如果由于某种原因而被迫使用旧版本的VS VS,然后一个人会遇到此类错误,直到可以将其升级到新版本为止。
—
Kaiserludi
FWIW可以在即将到来的Visual Studio 2015中正常运行
—
ismail