首頁 >後端開發 >C++ >為什麼 MSVC 在某些情況下對有符號/無符號比較發出警告,而在其他情況下則不發出警告?

為什麼 MSVC 在某些情況下對有符號/無符號比較發出警告,而在其他情況下則不發出警告?

DDD
DDD原創
2024-12-26 01:27:11625瀏覽

Why Does MSVC Warn About Signed/Unsigned Comparisons in Some Cases But Not Others?

MSVC 中的有符號和無符號整數比較

考慮以下程式碼片段:

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 標準中定義的「轉換」規則。這些規則決定在比較之前發生哪些提升:

  • 整數提升(例如,int 到long int)
  • 如果無符號運算元大於有符號運算元,則轉換為無符號運算元的型別運算元
  • 如果兩個運算元都是,則轉換為unsigned long int整數

為什麼 a == b 沒有警告?

在範例中,當使用 == 比較 a 和 b 時,MSVC 不會發出警告因為兩個運算元在比較之前都被轉換為 unsigned int。由於a和b的值都是正數,因此不存在有符號/無符號不匹配,結果是正確的。

直觀和非直觀結果

而缺少 a == b 的警告可能看起來很直觀,但對於像 a

結論

MSVC 不會對a == b 發出警告,因為通常的算術轉換導致兩個操作數都轉換為相同的無符號類型,從而消除任何有符號/無符號不符。但是,對於使用 ,由於轉換而可能出現意外結果,編譯器會發出警告。

以上是為什麼 MSVC 在某些情況下對有符號/無符號比較發出警告,而在其他情況下則不發出警告?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn