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(假),则第二个语句是 运行。
代码
#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(假),则第二个语句是 运行。