2010-07-23 63 views
30

我正在編寫一個控制檯應用程序,試圖通過試驗和錯誤「猜測」一個數字,它工作正常,所有但它讓我想知道某個部分,我寫心不在焉,?:三元條件運算符行爲,當留下一個表達式爲空

的代碼是:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int x,i,a,cc; 
    for(;;){ 
    scanf("%d",&x); 
    a=50; 
    i=100/a; 
for(cc=0;;cc++) 
{ 
    if(x<a) 
    { 
     printf("%d was too big\n",a); 
     a=a-((100/(i<<=1))?:1); 

    } 
    else if (x>a) 
    { 
     printf("%d was too small\n",a); 
     a=a+((100/(i<<=1))?:1); 

    } 
    else 
    { 
     printf("%d was the right number\n-----------------%d---------------------\n",a,cc); 
     break; 
    } 
} 
} 
return 0; 
} 

更特別的是困惑我的部分是

a=a+((100/(i<<=1))?:1); 
//Code, code 
a=a-((100/(i<<=1))?:1); 

我以前((100/(i<<=1))?:1)使蘇如果100/(i<<=1)返回0(或false),整個表達式將評估爲1 ((100/(i<<=1))?:***1***),並且如果它是真的空((100/(i<<=1))? _this space_ :1),我留下了可以工作的條件部分,它似乎能正常工作,但是在離開時有條件的空白的一部分?

+0

這種類型的條件被稱爲三元操作。如果您重新標記或重新標題以包含「三元」,則可能會得到更好的回覆。 – 2010-07-23 14:32:21

+1

@Segphault:它被稱爲*條件運算符(在C中)。它是* a *三元運算符的一個例子,它是一個通用術語,指的是具有三個操作數的任何運算符。 – JeremyP 2010-07-23 14:47:02

+0

如果您懷疑,導致這個問題,毫無疑問,您應該明確地做出真實案例分配。 TooBored ....考慮不編碼愚蠢的控制檯遊戲,因爲它是一個積極的無聊反饋。 – jpinto3912 2010-07-23 14:56:57

回答

52

這是一個GNU C擴展(請參閱?: wikipedia entry),因此爲便於攜帶,您應明確說明第二個操作數。

在'true'情況下,它返回條件結果。

下面的語句是幾乎等同:

a = x ?: y; 
a = x ? x : y; 

唯一的區別是在第一條語句,x總是計算一次,而在第二,x將被評估,如果兩次這是真的。所以唯一的區別是當評估x有副作用。

無論哪種方式,我都會認爲這是對語法的巧妙運用......如果您對維護您的代碼的人有任何同情心,則應明確說明操作數。 :)

另一方面,這是一個常見用例的一個很好的小竅門。

+5

幾乎等同於...除'x'只在'x?:y'中計算一次。 – kennytm 2010-07-23 14:40:56

+0

@KennyTM:是的,我應該明確說明。 – Stephen 2010-07-23 14:45:44

+1

我在xlc(IBM XL C/C++ for AIX,V11.1)上嘗試了這種三元語法,並且它也工作正常。 – Ted 2015-09-03 01:51:07

16

這是一個給C語言的GCC extension。當?:之間沒有任何內容出現時,則比較值將用於真實情況。

條件表達式中的中間操作數可以省略。那麼如果第一個操作數是非零值,它的值就是條件表達式的值。

因此,表達式

    x ? : y

具有x的值,如果這是非零;否則,y的值。

這個例子完全等同於

    x ? x : y

在這個簡單的情況下,省略中間操作數的能力並不特別有用。當它變得有用的時候,第一個操作數的確有用,或者可能(如果它是一個宏參數)包含副作用。然後在中間重複操作數會執行兩次副作用。忽略中間操作數使用已計算的值,而不會產生重新計算它的不良影響。