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

在这里插入图片描述
今天在老王的技术手册看到一个问题:

<?php

if ($a = 100 && $b = 200) {

     var_dump($a, $b);

}

输出是什么?

这个问题,咋一看或许觉得简单,但其实仔细推敲并不简单。

如果说布尔与之前的部分,,是由于优先级的问题,,但是如果仅仅是优先级的问题的话,那么结果应该是:

$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); } 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;

本文参考地址:https://www.php.cn/php-weizijiaocheng-432142.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值