如何解决三元运算符的右结合性
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 将始终被执行。没有理由在像
这样的语句中检查 expressionFalsestd::cout << (true ? "high pass" : (false ? "fail" : "pass"))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。