首頁 >後端開發 >C++ >為什麼 MSVC 不對有符號/無符號相等比較 (==) 發出警告,但對其他比較發出警告?

為什麼 MSVC 不對有符號/無符號相等比較 (==) 發出警告,但對其他比較發出警告?

Patricia Arquette
Patricia Arquette原創
2024-12-21 00:14:16695瀏覽

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