c - 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).
话虽如此,我真的不认为这样做是一个好主意,代码应该尽可能地表达意图,这里的意图应该是根据比较选择执行路径。这意味着,如果您正在寻找一个奇数,您应该使用类似(num % 2) == 1
.
您也不需要在每个代码路径中单独printf
调用:
printf("%d is %s\n", num, ((num % 2) == 1) ? "odd" : "even");
你会注意到我也使用num
了i
. 这只是我的一个风格的东西,与上述意图有关。如果该变量仅用作索引,我很乐意使用i
-type 变量(a)但是,第二个它获得语义属性(如检查奇数的数字),我倾向于使用更具描述性的名称。
我对使用简单变量名的人没有意见,我只是更喜欢在我自己的代码中使用更具描述性的变量名。
(a)实际上,我可能会idx
在这种情况下使用,但这太CDO (b)了,即使对我来说也是如此:-)
(b)强迫症,但顺序正确 :-)
推荐阅读
- xml - XML 验证器如何知道在哪里可以找到在 xml 文档中声明的模式实例以解析和使用 xsd?
- php - laravel上传新头像后如何删除旧头像?
- macos - 如何从局域网上的 Windows 10 家用电脑 RDP Ubuntu 16.04 和 OSX
- angular - 自定义验证器以检查密码是否在 Angular 6 和响应式表单中匹配
- python - 使用 Python 和 websocket-client 库发送安全 (SSL) Web 套接字请求,并希望更好地了解正在发生的事情
- javascript - 如何在 location.replace 后保持浏览器窗口全屏?
- python - 如何在不覆盖的情况下将数据附加到数据帧?
- node.js - 当应用程序被杀死时,我如何跟踪我的移动应用程序用户
- c# - 如何反序列化没有键的json数组?C#
- php - 检查键是否存在于另一个数组中,然后取值