考虑以下代码片段:
int a = INT_MAX; unsigned int b = UINT_MAX; bool c = false; if (a < b) // warning C4018: '<' : signed/unsigned mismatch c = true; ... // Additional comparisons if (a == b) // no warning c = true; ... // Additional comparisons
了解有符号/无符号不匹配
在 C 中,签名并无符号整数具有不同的类型,当直接比较它们时(例如,使用 <、>),MSVC 会发出警告 (C4018)。这是因为编译器在执行比较之前尝试将两个操作数提升为通用类型。
提升规则
对于整数比较,MSVC 遵循“通常的算术” C 标准中定义的“转换”规则。这些规则确定在比较之前发生哪些提升:
为什么 a == b 没有警告?
在示例中,当使用 == 比较 a 和 b 时,MSVC 不会发出警告因为两个操作数在比较之前都被转换为 unsigned int。由于a和b的值都是正数,因此不存在有符号/无符号不匹配,结果是正确的。
直观和非直观结果
而缺少 a == b 的警告可能看起来很直观,但对于像 a < 这样的比较却不能这么说。 b.在这种情况下,将 a 转换为无符号会产生更大的值,这会影响比较的结果。因此,MSVC 会发出警告,以突出显示有符号/无符号比较的潜在问题。
结论
MSVC 不会对 a == b 发出警告,因为通常的算术转换导致两个操作数都转换为相同的无符号类型,从而消除任何有符号/无符号不匹配。但是,对于使用 << 等运算符进行比较或 >,由于转换而可能出现意外结果,编译器会发出警告。
以上是为什么 MSVC 在某些情况下对有符号/无符号比较发出警告,而在其他情况下则不发出警告?的详细内容。更多信息请关注PHP中文网其他相关文章!