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中文網其他相關文章!