首页 >后端开发 >C++ >为什么 MSVC 不对有符号/无符号相等比较 (==) 发出警告,但对其他比较发出警告?

为什么 MSVC 不对有符号/无符号相等比较 (==) 发出警告,但对其他比较发出警告?

Patricia Arquette
Patricia Arquette原创
2024-12-21 00:14:16693浏览

Why Doesn't MSVC Warn About Signed/Unsigned Equality Comparisons (==) But Warns About Other Comparisons?

MSVC 中带符号和无符号值的比较:了解警告的缺失

在此代码片段中,您会注意到缺少警告具体比较:

int a = INT_MAX;
unsigned int b = UINT_MAX;
bool c = false;
...
if (a == b) // no warning

这提出了为什么要比较有符号的问题使用 == 进行比较时,无符号值不会触发警告,而其他比较(、=)则会触发警告。

后台提升和C4018

您预计此比较会因后台升级而产生警告。然而,最后两个例子反驳了这个逻辑:

if (((unsigned int)a) == b) // no warning
if (a == ((int)b)) // no warning

转换规则

当比较有符号和无符号值时,编译器遵循 C 中概述的特定转换规则标准。对于相等比较 (==),操作数有符号还是无符号并不重要,因为结果始终是布尔值(true 或 false)。

但是,对于其他比较,有符号值会被转换至未签名。这种转换很重要,因为它会影响比较结果。例如,在以下语句中:

-1 > 2U

结果为 true,因为 -1 被转换为一个大的无符号正整数,从而导致正确的比较。

MSVC 警告级别

MSVC 选择抑制有符号/无符号相等比较的警告是有意的。根据开发人员的说法,使用 == 比较有符号和无符号值通常会产生直观的结果。例如,无论有符号还是无符号,-1 == -1 都是 true。

另一方面,在有符号/无符号上涉及大于 (>) 或小于 (

以上是为什么 MSVC 不对有符号/无符号相等比较 (==) 发出警告,但对其他比较发出警告?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn