Jay*_*Yay 0 c++ operators operator-precedence associativity
std::cout << (true ? "high pass" : false ? "fail" : "pass")
Run Code Online (Sandbox Code Playgroud)
是相同的
std::cout << (true ? "high pass" : (false ? "fail" : "pass"))
Run Code Online (Sandbox Code Playgroud)
既然三元运算符是右结合的,为什么我们不先进行右运算呢?不应该pass打印而不是high pass?
您误解了运算符结合性。这只是将具有相同优先级的运算符分组的方法,并且不会以任何方式影响计算顺序。所以cond1 ? 1 : cond2 ? 2 : cond3 ? 3 : 4会被解析为
cond1 ? 1 : (cond2 ? 2 : (cond3 ? 3 : 4))
Run Code Online (Sandbox Code Playgroud)
从右边开始,而不是像
((cond1 ? 1 : cond2) ? 2 : cond3) ? 3 : 4
Run Code Online (Sandbox Code Playgroud)
它从左侧对操作数进行分组。一旦“添加”括号,表达式将按正常顺序求值
事实上,PHP 将三元运算符设为左关联,这是其最大的错误之一,而且目前无法修复。请参阅了解嵌套 PHP 三元运算符
更新: 三元运算符的左关联性已在 PHP 7.4 中弃用,并在 PHP 8.0 中删除