2017-03-03 80 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是一种强类型语言,这意味着编译器需要能够推导出任何表达式的类型。这包括?:表达式,所以该运算符的第二个和第三个参数不可能具有不兼容的类型。