2014-11-06 192 views
2

通用原型: EXP1 EXP2:EXP3Ternery運營商

三元經營者有EXP2的返回類型。 exp3需要與exp2具有相同的返回類型,或者至少有一個隱式轉換。否則它會拋出錯誤

在下面的程序中,由於exp3是int而exp2是char *,所以我在CodeBlocks中出現錯誤。 Bjut當我用0替換1時,它正在打印0 ..

0也是一個int值。我無法理解。

#include <iostream> 
    using namespace std; 

    int main() 
    { 
    int test = 0; 
    cout << test ? "A String" : 1; 

    return 0; 
    } 
+3

0被隱式轉換爲空指針,或者正如標準所說的那樣,'0'是空指針常量。 – user657267 2014-11-06 06:10:52

+1

請注意,它正在打印的「0」不是表達式右側的「0」,而是「test」的值。三元表達式的值被丟棄。 – 2014-11-06 06:14:32

+0

謝謝...是的,你是正確的..0是一個空指針常量.. – 2014-11-06 06:16:30

回答

8

三元運算符具有相當低的優先級。唯一具有較低優先級的運算符是逗號運算符。因此,您的表達被解釋爲

(std::cout << test) ? "A String": 1; 

這可能不是您想要的。然而,你的問題其實是關於兩個表達式之間的區別:

  1. 表達

    expr? "A String": 1 
    

    不工作,因爲有一個字符串之間,即不常見的類型,該類型char const(&)[9],和一個整數字面量,即類型int

  2. 表達

    expr? "A String": 0 
    

    工作因爲0可以被認爲是一個指針常數和字符串文字將愉快地衰減到char const*

值得注意,因爲Chris Culter指出的,使用一個空指針與輸出操作者根據27.7.3.6.4 [ostream.inserter.character]段落3是未定義的行爲:

template<class traits> 
    basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>& out, 
              const char* s); 

[...]

需要:■不得空指針。

+0

過分nitpicky,但唯一的指針文字是'nullptr',0是一個整數字面值是也是一個空指針常量。 – user657267 2014-11-06 06:25:51

+1

@ user657267:是的,我認爲你是對的。我相應地編輯了回覆。 – 2014-11-06 06:30:36

+0

有點偏離主題,但值得一提的是,實際上不應該將空指針傳遞給operator <<(ostream,char const *)',因爲結果是未定義的行爲(引用在[本答案](http: //stackoverflow.com/questions/7019454/why-does-stdcout-output-disappear-completely-after-null-is-sent-to-it))。例如,libC++勇敢地在指針上調用'strlen'並崩潰。 – 2014-11-06 06:34:36

2

流運算符具有更高的優先級,因此它將始終輸出測試。嘗試:

cout << (test ? "A String" : 1); 
+0

它仍然給不同的數據類型的錯誤 – 2014-11-06 06:17:49