我试图了解为什么以下代码不会在指定位置发出警告。
//from limits.h
#define UINT_MAX 0xffffffff /* maximum unsigned int value */
#define INT_MAX 2147483647 /* maximum (signed) int value */
/* = 0x7fffffff */
int a = INT_MAX;
//_int64 a = INT_MAX; // makes all warnings go away
unsigned int b = UINT_MAX;
bool c = false;
if(a < b) // warning C4018: '<' : signed/unsigned mismatch
c = true;
if(a > b) // warning C4018: '<' : signed/unsigned mismatch
c = true;
if(a <= b) // warning C4018: '<' : signed/unsigned mismatch
c = true;
if(a >= b) // warning C4018: '<' : signed/unsigned mismatch
c = true;
if(a == b) // no warning <--- warning expected here
c = true;
if(((unsigned int)a) == b) // no warning (as expected)
c = true;
if(a == ((int)b)) // no warning (as expected)
c = true;
我以为是和背景推广有关,但最后两个似乎不是这么说的。
在我看来,第一个 ==
比较与其他比较是有符号/无符号不匹配吗?
原文由 Peter 发布,翻译遵循 CC BY-SA 4.0 许可协议
从 C++20 开始,我们具有用于正确比较有符号无符号值的特殊功能 https://en.cppreference.com/w/cpp/utility/intcmp