【问题标题】:C ternary operator branches evaluation?C三元运算符分支评估?
【发布时间】:2022-01-06 18:13:35
【问题描述】:

我一直认为C 中的三元运算符没有评估未通过测试的分支。为什么在这种情况下呢? a 小于 b,因此只有 c 应分配给 1d 应保留为 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 &lt; b ? c = 1 : (d = 1);
  • 你需要跳过这么多圈才能让它正确,这清楚地表明条件表达式在这里并不是最好的解决方案。为什么不是简单的if else 声明?哪个更易读、更清晰、更易于维护,也更难出错。
  • 你说得对,我正在做一个练习,想看看是否有可能并陷入了这个优先级问题。

标签: c branch conditional-operator expression-evaluation


【解决方案1】:

逗号运算符的优先级低于条件运算符,因此您的表达式相当于:

(a < b ? c, c = 1 : d), d = 1;

【讨论】:

  • 谢谢!就是这么简单。
  • 而条件运算符在C++中的优先级不同,请注意。
猜你喜欢
  • 1970-01-01
  • 2017-03-27
  • 2011-07-03
  • 1970-01-01
  • 2016-04-29
  • 2016-04-14
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多