我有如下简单的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 ++控制台应用程序)进行编译,第7行出现“warning C4018:“'<':signed/unsigned mismatch”
,并且代码存在逻辑错误。如预期。
但是,如果我将unsigned int b = 10;
更改为const unsigned int b = 10;
,则警告会消失!是否有任何已知原因导致这种行为?无论const
如何,gcc
都会显示警告。
更新
从评论中可以看出,很多人认为“它只是被优化了,所以不需要警告”。不幸的是,确实需要警告,因为我的代码示例实际上存在一个精心放置以触发警告的逻辑错误:即使-10
实际上小于10
,print
语句也不会被调用。这个错误是众所周知的,“signed/unsigned warning”正是为了找到这样的错误而引发的。
更新
我还可以从评论中看到,很多人在我的代码中“发现”了一个有符号/无符号的逻辑错误,并对其进行了说明。没有必要这样做——这个错误是纯粹为了触发警告而放置的,是微不足道的(-10
转换为(unsigned int)-10
,即0xFFFFFFFF-10
),问题并不在于此 :)。
a < 10
。 - Applesconst
变量...它就是a<10
。 - Mooing DuckFFFFFFF6
(-10)不小于0Ah
(10),因此程序跳过了打印代码块。 - StarPilot该问题似乎只间接与sizeof的使用有关。编译器在涉及无符号类型的常量值比较的其他情况下也无法发出警告。
不幸的是,该错误链接已失效。 - Jesse Good