【发布时间】:2022-01-06 18:13:35
【问题描述】:
我一直认为C 中的三元运算符没有评估未通过测试的分支。为什么在这种情况下呢? a 小于 b,因此只有 c 应分配给 1,d 应保留为 2。感谢您的提示和建议。我用 gcc-9 和 clang 编译过。
#include <stdio.h>
int main() {
int a = 42;
int b = 99;
int c = 0;
int d = 2;
// Both branches are evaluated?
a < b ? c, c = 1 : d, d = 1;
printf("c %d, d %d.\n", c, d);
// Prints c 1, d 1.
}
【问题讨论】:
-
这里为什么要用逗号?
-
因为否则编译器会给我一个错误
lvalue required as left operand of assignment,我仍在调查(至少有一个逗号必须保留)。 -
这原来是运算符优先级的另一个问题。在它周围放上括号可以修复它。
a < b ? c = 1 : (d = 1); -
你需要跳过这么多圈才能让它正确,这清楚地表明条件表达式在这里并不是最好的解决方案。为什么不是简单的
if else声明?哪个更易读、更清晰、更易于维护,也更难出错。 -
你说得对,我正在做一个练习,想看看是否有可能并陷入了这个优先级问题。
标签: c branch conditional-operator expression-evaluation