考慮以下程式碼片段:
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
結論
MSVC 不會對a == b 發出警告,因為通常的算術轉換導致兩個操作數都轉換為相同的無符號類型,從而消除任何有符號/無符號不符。但是,對於使用 ,由於轉換而可能出現意外結果,編譯器會發出警告。
以上是為什麼 MSVC 在某些情況下對有符號/無符號比較發出警告,而在其他情況下則不發出警告?的詳細內容。更多資訊請關注PHP中文網其他相關文章!