这个问题, 咋一看或许以为大略, 但实在仔细考虑并不大略,
如果说布尔与之前的部分, 是由于优先级的问题, 但是如果仅仅是优先级的问题的话, 那么结果该当是:
$a = (100 && $b) = 200
而实际上的结果, 确实高优先级的&&让步给次优先级的=, 让 $b = 200 先结合了.
究其缘故原由, 是由于PHP并不完备遵守优先级的定义, 这个在PHP的手册中也有解释:
Note: Although = has a lower precedence than most other operators, PHP will still allow expressions similar to the following: if (!$a = foo()), in which case the return value of foo() is put into $a.
这样的设计, 个人不揭橥意见, 反正在C措辞中, 这样类似的语句是剖断为语法错的. PHP采取这样的设计, 很可能是历史缘故原由,
有好奇的同学, 会想知道到底为什么, 之前jayeeliu网友也问过:
laruence你好:
问一个php运算符优先级的问题
$t == 1 && $tt = 2
按照php运算符优先级该当是
(($t == 1) && $tt) = 2
这个顺序实行,但实际上该当是
($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); } exp
末了, 顺便说一下, 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;