C++程式設計師看過來,false < false的設定恰當嗎?

sapphire發表於2015-01-10

本文摘編自 StackOverflow 上的一個熱門問答貼,duncan 提問:

C++中是否規範地定義了:

  1. 布林引數中的“小於(less than)運算子”,並且如果有的話,
  2. 四個引數排列的結果是什麼?

換句話說,以下操作的結果是有準確定義的嗎?

在我的設定下(Centos 7, GCC 4.8.2),下面的程式碼得出了我期望的結果(鑑於C用0表示false,用1表示true)

雖然我敢肯定,大多數(甚至所有?)編譯器都會給出相同的輸出,但這是由C++的標準規定的嗎?或者這是一個模糊點,但符合規範的編譯器可以算出true是小於false的?

最佳回答來自 Shafik Yaghmour

該操作是根據C+ +標準明確界定的。

細節:

我們可以通過查詢C++規範5.9節關係運算子的說明:

運算元必須有算數型別、列舉型別、或指標型別,又或是鍵入的std :: nullptr_t。該操作符<(小於),>(大於),<=(小於或等於),和> =(大於或等於)所有產生的結果均為false或true。結果為布林型。

而布林變數是在3.9.1基本型別中的算數型別。

型別為BOOL,CHAR,char16_t,char32_t,wchar_t的,和有符號、無符號整型統稱為整型。

並且整數和浮點型別統稱為算術型別。

此外,true和false是2.14.6布林文字量中的布林文字量:

回到5.9節來更深層地理解關係操作符的機制,它說:

通常的算數轉化是在算數或列舉型別的運算元下執行的。

通常的算數轉化在第五節中提及,它說:

否則整形提升(4.5)應該在兩個運算元上執行,

並且4.5節提到:

bool型別的prvalue可轉換為int型別的prvalue,這時false變為0,true變為1。

所以表示式:

通過這樣的規則會變成:

相關文章