2017-03-03 21 views
0

在C中如何在使用兩種不同數據類型的printf語句中使用條件運算符?我希望下面的代碼每次遇到偶數時不打印任何零而不打印零。我還希望能夠在遇到特定數字時打印字符串。如何使用條件運算符打印整數或字符串值

我試過類型鑄造(字符)列表[我],但會導致不兼容的類型轉換,因爲printf語句需要一個整數。

僅打印奇數值

int fail = 0; 

    int list[] = {1, 2, 3, -1, 4}; 
    int size = sizeof(list)/sizeof(list[0]); 

    for(int i = 0; i < size; i++) { 
     if(list[i] == -1) { 
      break; 
     } 
     printf("%d\n", (list[i] % 2 == 0) ? (i) : (fail)); 
    } 
+3

爲什麼不使用'if'語句在相應的'printf'語句之間進行選擇? –

+0

您可以使用相同的'?'運算符在「%s」和「%d」之間作爲格式說明符字符串進行選擇... – bruceg

+1

如何?操作符在格式說明符中工作? – Yawn

回答

2

正確和可讀性的方法是使用多次打電話給printf,每個都有自己的格式和參數:

if (list[i] % 2 == 0) { 
    printf("%d\n", i); 
} 
else if (i == 42) { 
    puts("The answer"); 
} 
/* Otherwise, print nothing */ 

你也可以做到這一點與?:操作:

(list[i] % 2 == 0) ? printf("%d\n", i) : 
(i = 42)   ? printf("%s\n", "The answer") : 
        0; 

(這工作,因爲所有三種可能的返回值是打印的字符數)

如果你只想打印0如無物,而不是0,使用0作爲格式說明的精度(未寬度):

printf("%.0d\n", i); 

(在混淆代碼中,您可以用三元運算符強制要隱藏的值爲0。或者甚至是乘法)。

C是一種強類型語言,這意味着編譯器需要能夠推導出任何表達式的類型。這包括?:表達式,所以該運算符的第二個和第三個參數不可能具有不兼容的類型。