【问题标题】:Does the ternary operator short circuit in a defined way三元运算符是否以定义的方式短路
【发布时间】:2016-01-29 18:48:51
【问题描述】:

如果您有以下情况:

if (x)
{
    y = *x;
}
else
{
    y = 0;
}

那么就保证定义了行为,因为我们只能取消引用x,如果它不是0

也可以这样说:

y = (x) ? *x : 0;

这似乎按预期工作(即使在 g++ 上使用 -Wpedantic 编译)

这是有保证的吗?

【问题讨论】:

  • 是的 - 三元运算符只是语法糖
  • 是的。 (太短,无法作为答案发布)。
  • 三元表达式中没有“短路”。并且它不会在条件被完全评估之前过早地评估或执行任何分支。
  • @EdHeal 我想不出它会是什么语法糖。
  • @EdHeal 但是条件运算符给你一个表达式,而不是一个语句。

标签: c++ undefined-behavior conditional-operator short-circuiting


【解决方案1】:

是的,只会计算第二个或第三个操作数,C++ 标准草案草案5.16[expr.cond] 说:

条件表达式从右到左分组。第一个表达式根据上下文转换为 bool(第 4 条)。 它被评估,如果为真,则条件表达式的结果是第二个表达式的值, 否则是第三个表达式。 仅计算第二个和第三个表达式中的一个。 每个值 与第一个表达式相关的计算和副作用在每个值计算之前排序 以及与第二个或第三个表达式相关的副作用。

【讨论】:

  • 所以,x ? *x++ : 0 不会增加 x iff x == 0
猜你喜欢
  • 2023-04-10
  • 2019-02-01
  • 2016-05-11
  • 2021-10-06
  • 2011-03-07
  • 2013-06-24
  • 2014-12-03
  • 2019-10-08
  • 2015-02-07
相关资源
最近更新 更多