首页 > 解决方案 > 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

标签: cif-statementconditional-statementsconditional-operator

解决方案


在 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).

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

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

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

你会注意到我也使用numi. 这只是我的一个风格的东西,与上述意图有关。如果该变量仅用作索引,我很乐意使用i-type 变量(a)但是,第二个它获得语义属性(如检查奇数的数字),我倾向于使用更具描述性的名称。

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


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


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


推荐阅读