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

时间:2019-12-06 00:56:27

标签: c if-statement conditional-statements conditional-operator

代码

#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的原因,为什么它仍然可以正常工作?

2 个答案:

答案 0 :(得分:4)

在C语言中,可以在布尔上下文中使用整数,并且零表示false,而非零表示true。

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

以下表达式均可用于检测奇数:

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

话虽如此,我并不是真的认为这样做是一个好主意,代码应该尽可能表达 intent ,这里的意图应该是根据比较来选择执行路径。这意味着,如果您要查找奇数,则应使用类似(num % 2) == 1的数字。

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

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

您会发现我也使用了num而不是i。这仅仅是我的风格,与上述意图有关。如果该变量仅用作索引,我很乐意使用i类型的变量(a),但是第二个它获得了语义属性(例如检查数字)出于怪异),我倾向于使用更具描述性的名称。

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


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


(b) OCD,但顺序正确:-)

答案 1 :(得分:-1)

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。请注意,当我变为0,即false时,它将停止。

现在回到问题,i%2始终将导致0或1。如果为1(true),则运行第一条语句,而如果为0(false),则运行第二条语句。

相关问题