2012-02-08 43 views
0

那麼,我有一個關於三元運算符逗號的問題。 廢話少說,代碼如下:在條件三元運算符中使用逗號時發現的東西?

void test_comma_in_condition(void) 
{ 
    int ia, ib, ic; 

    ia = ib = ic = 0; 
    bool condition=true; 

    cout<<"Original:"<<endl; 
    cout<<"ia: "<<ia<<endl; 
    cout<<"ib: "<<ib<<endl; 
    condition?(ia=1, ib=2):(ia=11, ib=12); 
    cout<<"After:"<<endl; 
    cout<<"ia: "<<ia<<endl; 
    cout<<"ib: "<<ib<<endl; 

    ia = ib = ic = 0; 
    condition?ia=1, ib=2, ic=3:ib=22,ia=21, ic=23; 
    cout<<"The operation must be bracketed, or you'll see..."<<endl; 
    cout<<"ia: "<<ia<<endl; 
    cout<<"ib: "<<ib<<endl; 
    cout<<"ic: "<<ic<<endl; 

    condition?ia=1, ib=2, ic=3:ia=21, ib=22, ic=23; 
    cout<<"The operation must be bracketed, or you'll see..."<<endl; 
    cout<<"ia: "<<ia<<endl; 
    cout<<"ib: "<<ib<<endl; 
    cout<<"ic: "<<ic<<endl; 

    return; 
} 

輸出將是這樣的:

Original: 
ia: 0 
ib: 0 
After: 
ia: 1 
ib: 2 
The operation must be bracketed, or you'll see... 
ia: 21 
ib: 2 
ic: 23 
The operation must be bracketed, or you'll see... 
ia: 1 
ib: 22 
ic: 23 

這是合法的嗎?

+2

你在說'a? b:c,d'應該是'a? b:(c,d)'而不是'(a?b:c),d'。在不瞭解哪個是正確的問題的情況下,您懷疑編譯器的原因是什麼? – hvd 2012-02-08 08:02:43

+3

是的,它是合法的 - 但也是不可讀的。 – 2012-02-08 08:04:31

回答

7

這是一個運算符優先級的問題。你的表情:

condition?ia=1, ib=2, ic=3:ib=22,ia=21, ic=23; 

是由編譯器理解爲:

(condition?(ia=1, ib=2, ic=3):(ib=22)),ia=21, ic=23; 

在這一點上,你應該能夠明白爲什麼你的程序的輸出。

+0

扮演魔鬼的擁護者,但是如果這是一個優先問題,爲什麼'''在條件表達式的「中間」似乎具有比'::'更高的優先級,但是條件表達式的尾部具有更低的優先級? – 2012-02-08 08:22:04

+0

我爲你的答案+1了,因爲它回答了這個好問題 - 逗號表達式是「表達式」的一部分,但不是「賦值表達式」的一部分。 – 2012-02-08 08:26:53

+0

你不能在這裏調用優先級。形式上,C++操作符不是按優先順序排序,而是按語法中的不同生成順序排列。大多數情況下,效果與具有與標準中呈現產品的順序相對應的優先順序相同,但至少有兩個例外:此處(其中第二項可以是_any_表達式)和一些涉及C風格轉換和前綴運算符的情況。 – 2012-02-08 08:30:07

1

問題是,逗號運算符有the lowest precedence there is。由於這個原因,條件運算符的else部分只是第一個賦值,之後逗號運算符開始執行,另外兩個語句也將被執行。

2

這是合法的,但 愚蠢 這樣寫代碼不是很有用。

代碼

condition?ia=1, ib=2, ic=3:ia=21, ib=22, ic=23; 

相當於

condition?(ia=1, ib=2, ic=3):ia=21; 
ib=22; 
ic=23; 

只是更難閱讀。

+0

另一個問題?這裏逗號是如何分析的?或者如何使用逗號? – Joseph 2012-02-16 01:20:45

+0

逗號運算符可以用來分隔表達式,就像它在這裏所做的那樣。與分號不同,*表達式終止,逗號允許你在一個地方有幾個表達式,否則只允許一個表達式。在實踐中不是非常有用,可能會給讀者造成混淆。 – 2012-02-16 06:38:32

5

是的,對於條件表達式的相關語法是:

logical-or-expression ? expression : assignment-expression 

爲賦值表達式(其也可以是一個條件表達式擲表達):

logical-or-expression assignment-operator assignment-expression 

以及用逗號運算符表達式(賦值表達式也可以是表達式):

expression , assignment-expression 

這意味着構建a ? b : c, d不能被解析爲等同於a ? b : (c, d)因爲c, d不是賦值表達式但必須被解析爲等同於(a ? b : c), d

有一個在condition ? ia=1,ib=2,ic=3 : ia=21, ib=22, ic=23;沒有未定義的行爲,因爲condition評價任?:第二或第三操作數的評價含有逗號操作符逗號運算符的所述第一操作數的評價是之前和在每個子表達測序在評估第二個操作數之前進行排序。

+0

非常感謝,也許我需要一些關於表達和分配表達的東西。 – Joseph 2012-02-16 01:19:43