好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

PHP运算符优先级的一个例外


今天在老王的技术手册看到一个问题:

<?php
if ($a = 100 && $b = 200) {
var_dump($a, $b);
}

这个顺序执行,但实际上应该是

($t == 1) && ($tt = 2)

我有些不太理解。

其实也简单, 运算符优先级是在存在二义性文法的时候的一种规约规则选择的手段, 而PHP的语法分析文件定义中, 却让等号和T_BOOLEAN_AND(&&)之前不存在了规约冲突:

expr_without_variable:
  // 有隐规则存在, 相当于T_BOOLEAN_AND成为了"一元操作符".
  |   expr T_BOOLEAN_AND  { zend_do_boolean_and_begin(&$1, &$2 TSRMLS_CC); } expr

最后, 顺便说一下, PHP对应于T_BOOLEAN_AND 还定义了 T_LOGICAL_AND(and) 和 T_LOGICAL_OR(or) , 这俩个的优先级都低于等号, 于是就会有了, 很多PHP入门教材示例代码中经典的:

$result = mysql_query(*)  or die(mysql_error());

类似的还可以用or来实现三元操作符(?:)的功能:

$person = $who or $person = "laruence";
//等同于:
$person = empty($who)? "laruence" : $who;

更多PHP相关知识,请访问PHP中文网!

以上就是PHP运算符优先级的一个例外的详细内容,更多请关注Gxlcms其它相关文章!

查看更多关于PHP运算符优先级的一个例外的详细内容...

  阅读:44次