三元运算符的右结合性

问题描述

std::cout << (true ? "high pass" : false ? "fail" : "pass")

相同
std::cout << (true ? "high pass" : (false ? "fail" : "pass"))

既然三元运算符是右结合的,为什么不先进行右手操作呢?不应该打印 pass 而不是 high pass

解决方法

你误解了operator associativity。这只是将具有相同 precedence 的运算符分组的方法,并且不会以任何方式影响求值顺序。所以 cond1 ? 1 : cond2 ? 2 : cond3 ? 3 : 4 将被解析为

cond1 ? 1 : (cond2 ? 2 : (cond3 ? 3 : 4))

从右边而不是像

((cond1 ? 1 : cond2) ? 2 : cond3) ? 3 : 4

从左侧对操作数进行分组。添加括号后,表达式将按正常顺序计算

事实上,PHP made the ternary operator left-associative 这是它最大的错误之一,目前无法修复

,

三元运算符的工作原理类似于

variable = (condition) ? expressionTrue : expressionFalse;

这可以表达为

if (condition)
{
  expressionTrue;
}
else
{
  expressionFalse;
} 

你的两个 statements 语句的条件都是 true,所以 expressionTrue 将始终被执行。没有理由在像

这样的语句中检查 expressionFalse
std::cout << (true ? "high pass" : (false ? "fail" : "pass"))

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...