C中三元运算符的条件表达式

Conditional expression in ternary operator in C

代码

#include <stdio.h>

int main() {
  int i;
  for (i=1; i<=10; i++) {
        (i % 2) ? printf("%d is odd\n", i) : printf("%d is even\n", i);
  }
}

结果

1 is odd
2 is even
3 is odd
4 is even
5 is odd
6 is even
7 is odd
8 is even
9 is odd
10 is even

在上面的C程序中,为什么即使条件表达式只声明i%2而不是i%2!=0,它仍然可以正常工作?

在 C 中,整数可以在布尔上下文中使用,零表示假,非零表示真。

这就是您的代码有效的原因。表达式 num % 2 对于偶数将为 0(单个假值),对于奇数将为 1(许多可能的真值之一)。

以下表达式都适用于检测奇数:

num % 2
(num % 2) != 0
((num % 2) != 0) != 0
... and so on, ad untilyougetboredum (like 'ad infinitum' but with limits).

话虽如此,我真的不认为这样做是一个好idea,代码应该表达intent为尽可能多,这里的意图应该是基于比较来选择执行路径。这意味着,如果您正在寻找一个奇数,您应该使用类似 (num % 2) == 1.

的东西

您也不需要单独 printf 在这些代码路径的 每个 中调用:

printf("%d is %s\n", num, ((num % 2) == 1) ? "odd" : "even");

您会注意到我还使用了 num 而不是 i。这只是我的风格之物,与上述意图有关。如果变量仅用作索引,我很乐意使用 i 类型的变量 (a) 但是,第二个它获得语义 属性(就像检查一个数字是否奇怪),我倾向于使用更具描述性的名称。

我对使用简单变量名的人没有问题,我只是更喜欢在我自己的代码中使用更具描述性的变量名。


(a) 实际上,在那种情况下我可能会使用 idx 但那是 too CDO(b),甚至对我来说 :-)


(b) 强迫症但顺序正确:-)

C 没有专用的 boolean 类型。它使用 int 值作为布尔值。即 0 被视为 false,任何非零值都被视为 true。 尝试打印一些条件

printf("%d",5==5);
printf("%d",1>3);

这将输出 1 和 0。

C总是用1来表示true。但是在条件下使用时,任何其他非零值也可以正常工作。

if(6+1)
    printf("TRUE");

将打印 TRUE。

这也是我们可以使用这种形式的 while 循环的原因:

int i= 10;
while(i--){
    printf("%d",i);
}

将打印 9876543210。注意它在 i 变为 0 时停止,即 false.

现在回到问题,i%2 总是会导致 0 或 1。如果是 1(真),第一个语句是 运行,而如果是 0(假),则第二个语句是 运行。