本文摘編自 StackOverflow 上的一個熱門問答貼,duncan 提問:
C++中是否規範地定義了:
- 布林引數中的“小於(less than)運算子”,並且如果有的話,
- 四個引數排列的結果是什麼?
換句話說,以下操作的結果是有準確定義的嗎?
1 2 3 4 |
false < false false < true true < false true < true |
在我的設定下(Centos 7, GCC 4.8.2),下面的程式碼得出了我期望的結果(鑑於C用0表示false,用1表示true)
1 2 3 4 |
false < false = false false < true = true true < false = false true < true = false |
雖然我敢肯定,大多數(甚至所有?)編譯器都會給出相同的輸出,但這是由C++的標準規定的嗎?或者這是一個模糊點,但符合規範的編譯器可以算出true是小於false的?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> const char * s(bool a) { return (a ? "true" : "false"); } void test(bool a, bool b) { std::cout << s(a) << " < " << s(b) << " = " << s(a < b) << std::endl; } int main(int argc, char* argv[]) { test(false, false); test(false, true); test(true, false); test(true, true); return 0; } |
最佳回答來自 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布林文字量中的布林文字量:
1 2 3 |
boolean-literal: false true |
回到5.9節來更深層地理解關係操作符的機制,它說:
通常的算數轉化是在算數或列舉型別的運算元下執行的。
通常的算數轉化在第五節中提及,它說:
否則整形提升(4.5)應該在兩個運算元上執行,
並且4.5節提到:
bool型別的prvalue可轉換為int型別的prvalue,這時false變為0,true變為1。
所以表示式:
1 2 3 4 |
false < false false < true true < false true < true |
通過這樣的規則會變成:
1 2 3 4 |
0 < 0 0 < 1 1 < 0 1 < 1 |