三元运算符是不是以定义的方式短路

Posted

技术标签:

【中文标题】三元运算符是不是以定义的方式短路【英文标题】: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 但是条件运算符给你一个表达式,而不是一个语句。 【参考方案1】:

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

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

【讨论】:

所以,x ? *x++ : 0 不会增加 x iff x == 0

以上是关于三元运算符是不是以定义的方式短路的主要内容,如果未能解决你的问题,请参考以下文章

三元运算符可以等效于与逻辑运算符的短路吗?

使用三元运算符或仅短路评估之间的区别?

以函数方式重写嵌套的三元运算符

关系运算符逻辑 运算符与三元运算符

在条件中使用三元运算符会产生意外的输出

Swift:为什么三元运算符会创建数组的副本而不是引用原始数据?