c - C在短路表达式中对同一变量进行多次赋值
问题描述
我有三个变量:a
, b
, c
. 假设它们是整数。我想以特定顺序找到其中的第一个非零值,而无需循环。以下似乎可行,但我不确定这是因为我很幸运,还是因为语言保证了它:
int main(int argc, char *argv[]) {
int a = 0;
int b = 3;
int c = 5;
int test;
if ((test = a) != 0 || (test = b) != 0 || (test = c) != 0) {
printf("First non-zero: %d\n", test);
} else {
printf("All zero!\n");
}
return 0;
}
此处显示的带有短路的重复分配是否可以保证按预期工作,还是我遗漏了什么?
这可能是一个可以接受三个字母答案的地方,但两个字母的答案可能需要更多解释。
解决方案
它会!
由于 OR 运算符的性质,如果任何条件为真,则测试停止。
因此,我认为您所做的基本上相当于:
test = a != 0 ? a : b != 0 ? b : c != 0 ? c : 0;
printf("%d\n",test);
但是你的看起来不错。
[更新]
根据 chqrlie 提到的,它可以进一步简化为:
test = a ? a : b ? b : c;
推荐阅读
- javascript - 在 React 中将数据导出到可变数量的组件
- r - 如何在 RMarkdown 中引用观星者表?
- ios - 在 SwiftUI 中,我如何区分一般点击与单元格中的按钮点击?
- postgresql - 在 wso2 流式集成器中使用 PostgreSQL 作为数据源,
- python-3.x - 使用多个 supervisord 程序线程来执行单独的 APScheduler 任务,还是使用一个带有一个调度程序的程序来执行多个任务?
- sendto - 在 Windows 文件资源管理器中动态和实时定义“发送到”文件的文件路径
- r - 在 R 中过滤包含多个值和 null 的列
- wordpress - wordpress 中的多个搜索过滤器选择一个类别和一个自定义帖子分类
- typescript - 如何修复 esLint “ parserOptions.project 已为 @typescript-eslint/parser 设置”?
- c++ - Particle.io waitFor() 函数类似于系统