2015-06-18 152 views
-1

在學習C時,我遇到了一些令我頭腦混亂的東西。C三元運算符

表達式爲:

exp(V*log(i))?i%2?s:s--:s++; 

如果三元運算符是問陽:陰;?我以爲是這樣的:

if(pow(i,V)==1&&(i%2)==0) 
    s--; 
else 
    s++; 

然而,小號,我應該問不會在問題輸入什麼,第一個表達式是什麼意思?

程序工作完美,但我不明白爲什麼。

原程序是:

main(){ 
    #define V 1 

    int a, s=0, i; 
    for(i=1000;i>=0;i--) 
     exp(V*log(i))?i%2?s:s--:s++; 
    exp(V*log(i))?printf("%d\t%d\t",-s,i):printf("%d\t%d\t", s,-i); 
    getch(); 
} 
+0

一對額外的括號將使這個更加清晰。 –

+0

閱讀[運營商優先](https://en.wikipedia.org/wiki/Operators_in_C_and_C++)或[here](http://en.cppreference.com/w/c/language/operator_precedence) – Olaf

回答

1

如果EXP(V 日誌(I))爲真則測試是奇數則i%2 == 1如果是返回小號如果連返回S--如果EXP(V日誌(I))爲假返回小號++ 如果你把它寫這樣不是更容易看出:如果

exp(V*log(i))?(i%2?s:s--):s++; 
+0

Humm .. Thank你非常。它完全有意義。 –

+0

不客氣。當然,我交換了奇數,甚至在解釋。現在會修復它。 –

1

三元運算符測試一個表達式爲true。要理解這種情況下,你需要分析它,並分開操作的兩個用途:

exp(V*log(i))?i%2?s:s--:s++; 

這相當於

if(exp(V*log(i)) 
    if(i%2) 
     s; 
    else 
     s--; 
else 
    s++; 

唯一的區別是,它是一個表達式和一個單獨的語句,而不是if/else版本。它始終返回當前值s,但會根據條件進行更改。

exp如果指的是指數函數,那麼除非輸出是-inf輸出將是!=0因此該值將評估爲true。請注意,nan也會評估爲false,nanlog的輸出,當值超出其域時。

所以基本上你可以用更簡單的表達翻譯這個(除非V是零,爲i==0值會發生變化):

i>0?s++:i%2?s:s--;