我有以下简单的 C++ 代码:
#include "stdafx.h"
int main()
{
int a = -10;
unsigned int b = 10;
// Trivial error is placed here on purpose to trigger a warning.
if( a < b ) {
printf( "Error in line above: this will not be printed\n" );
}
return 0;
}
使用 Visual Studio 2010(默认 C++ 控制台应用程序)编译,它warning C4018: '<' : signed/unsigned mismatch" on line 7
按预期提供(代码有逻辑错误)。
但是如果我unsigned int b = 10;
改成const unsigned int b = 10;
警告就消失了!这种行为有什么已知的原因吗?gcc
无论const
.
更新
我可以从评论中看到很多人建议“它只是以某种方式进行了优化,所以不需要警告”。不幸的是,需要警告,因为我的代码示例有实际的逻辑错误仔细放置以触发警告:该print
语句将不会被调用,无论它-10
实际上小于10
. 这个错误是众所周知的,“签名/未签名警告”正是为了找到这样的错误而引发的。
更新
我还可以从评论中看到,很多人在我的代码中“发现”了一个有符号/无符号逻辑错误并正在解释它。哪里不需要这样做 - 这个错误纯粹是为了触发警告,是微不足道的(-10
被(unsigned int)-10
认为是0xFFFFFFFF-10
)并且问题与它无关:)。