PHP中的三元(条件)运算符和C/C++中的三元(条件)运算符竟然有着不同的结合性(associativity)

陪她去流浪 桃子 2016年02月02日 阅读次数:2142

之前我一直跟同学描述说,PHP在多个方面跟C语言很像,特别是函数名、标准库的使用,运算符。。。

然而今天遇到一个不同的,那就是三元运算符(ternary),也称作条件运算符。

PHP中条件运算符是左结合的,C/C++中条件运算符是右结合的。

之前我是这样写的:

$type = $p ? $p->type : isset($_GET['type']) ? $_GET['type'] : '';

想要的逻辑功能是:

if(文章不为空) {
    返回文章的type
}
else {
    if(有type查询) {
        返回type查询的值
    }
    else {
        返回空
    }
}

,然而事与愿违,由于PHP中条件运算符的左结合性,所以在PHP中是这样理解的:

变量 $has_type 为假
if(文章不为空) {
    if(文章的type不为空) {
        返回type查询的值
    }
    else {
        返回空
    }
}
else {
    if(有type查询) {
        返回type查询的值
    }
    else {
        返回空
    }
}

,仔细想想看,后者的逻辑明显有问题,肯定不是我想要的。

废话了这么多,作个总结吧:

当写类似这样的代码时:

$a ? $b : $c ? $d : $e

PHP中实际意思是:

($a ? $b : $c) ? $d : $e

C/C++中实际意思是(没有$,C/C++程序员比较穷):

a ? b : (c ? d : e)

总之,像有经验的老手告诉的那样,不清楚优先级、结合性时就加个括号吧,准靠谱。

可我为啥犯错了呢。。。因为我是个C/C++程序员,业余的PHP程序员。PHP毕竟是世界上最好的语言,没有之一。我得搞搞她。


参考:

  1. PHP: Operator Precedence
  2. C/C++中的运算符优先级总结
  3. Associativity from right to left in ternary operator
  4. 我竟然一直错误地认为PHP中的三元(条件)运算符跟C/C++中的三元(条件)运算符具有相同的结合性

这篇文章的内容已被作者标记为“过时”/“需要更新”/“不具参考意义”。

标签:php · C/C++