2014-09-01 49 views
1

一元誰能給我解釋一下,或者告訴我如何解決這個編碼的問題,我有一個與條件運算有條件的經營者使用C

它似乎總是跳過有條件的經營者和剛打印出的第二個選項,即使我改變服務器是0或1

,它總是打印出的第二個選項組B然後組A

爲什麼這不是工作?這是某種語義錯誤?或邏輯錯誤?

#include <stdio.h> 
#include <limits.h> 

int main(int argc, char *argv[]){ 

    int ch = -191; 
    int x = UINT_MAX; 
    int setA[5]={-1,-1,-1,-1,-1}; 
    int setB[5]={-2,-2,-2,-2,-2}; 
    int server = 1; 
    int i=2; 

    printf("%d %d\n",server==1?setA[i],setB[i]:setB[i],setA[i]); 
    printf("%d %d\n",server==0?setA[i],setB[i]:setB[i],setA[i]); 


    // printf("%u\n%u\n",ch,x); 

} 
+2

'INT X = UINT_MAX'是一個錯誤。 'int'只能保存值高達'INT_MAX'。 – 2014-09-01 04:42:09

+1

'server == n?setA [i],setB [i]:setB [i]'表示'server == n?setB [i]:setB [i]' – BLUEPIXY 2014-09-01 04:44:34

+0

您可以簡單地使用正確的語法想做。 I.E.而不是:printf(「%d%d \ n」,server == 1?setA [i],setB [i]:setB [i],setA [i]);你可以這樣做:printf(「%d%d \ n」,(server == 1)?(setA [i],setB [i]):(setB [i],setA [i])); – user3629249 2014-09-02 06:01:47

回答

5

爲三元操作的語法是:條件表達表達

在您的代碼第一個表達式爲setA[i], setB[i]和第二個表達式爲setB[i]。由於語言的語法的工作方式,最終逗號一種說法分離器(未第二表達的一部分),所以代碼等同於:

int a = (server == 1) ? setB[i] : setB[i]; 
printf("%d %d\n", a, setA[i]); 

這當然是一樣的:

printf("%d %d\n", setB[i], setA[i]); 

因此,無論條件如何,您總能得到相同的結果。


如果你要在一個代碼塊許多類似的線路,一個可能的解決方案是基於當前服務器上設置一些設置別名:

// do this once: 
int *set0, *set1; 
if (server == 1) 
    set0 = setA, set1 = setB; 
else 
    set0 = setB, set1 = setA; 

// then use it like this  
printf("%d %d\n", set0[i], set1[i]); 
+0

我想不出一種優雅的方式去做你想做的事情;一個預處理宏有問題,它會評估它的參數兩次;並且內聯函數會很麻煩,因爲您必須將數組傳遞給它以及條件結果 – 2014-09-01 04:57:14

+0

有if(server == 1)printf(「%d%d」,setA [i],setB [i ]); else printf(「%d%d」,setB [i],setA [i]);'雖然這並不好 – 2014-09-01 04:58:27

0

你應該使用三元運算這樣的:

server == 1 ? printf("%d %d", setA[i], setB[i]):printf("%d %d", setB[i], setA[i]);

同樣地,對於第二次發言。

你使用它的方式:

如果server == 1
然後setA[i], setB[i]評估爲setB[i],因爲那是逗號,運營商的財產C,只有執行的最後一條語句。

如果server == 1
然後

printf("%d %d\n",server==1?setA[i],setB[i]:setB[i],setA[i]);

將被評估爲(由於?:操作者經操作者,的高優先級)

printf("%d %d\n",(server==1?(setA[i],setB[i]):setB[i]),setA[i]);

這是

printf("%d %d\n",setB[i], setA[i]);

並且類似地

printf("%d %d\n",server==0?setA[i],setB[i]:setB[i],setA[i]);

將被簡單地評估爲

printf("%d %d\n",(server==0?(setA[i],setB[i]):setB[i]),setA[i])

這又是

printf("%d %d\n",setB[i],setA[i]);

您可以類似地解析server == 0您將得到相同的結果。

1
server==1?setA[i],setB[i]:setB[i],setA[i] 

注意條件運算符之間的逗號運算符,該表達式不會按照您的預期產生。

相反,我建議使用if聲明。它更清晰,更不容易出錯。

if (server == 1) 
{ 
    printf("%d %d\n", setA[i], setB[i]); 
} 
else 
{ 
    printf("%d %d\n", setB[i], setA[i]); 
} 
+0

儘管打印出的是第二個選項 setB [i],setA [i] – yukapuka 2014-09-01 04:53:03

1

表達

server==1?setA[i],setB[i]:setB[i],setA[i] 

相當於:

(server==1? (setA[i],setB[i]) : setB[i]), setA[i]) 

這相當於

(server==1? setB[i] : setB[i]), setA[i] 

這相當於

setB[i], setA[i] 

但是,那不是你想要的。你想要的是:

if (server == 1) 
{ 
    printf("%d %d\n", setA[i], setB[i]); 
} 
else if (server == 0) 
{ 
    printf("%d %d\n", setB[i], setA[i]); 
}