PHP学习笔记运算符优先级

运算符优先级是一个程序员必须了解并且撑握的一个重要的知识点了,下面我们一起来看看PHP运算符优先级文章吧,今天在老王的技术手册看到一个问题,代码如下:

<?phpif ($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(&&)之前不存在了规约冲突,实例代码如下:

  1. expr_without_variable:   
  2. // 有隐规则存在, 相当于T_BOOLEAN_AND成为了"一元操作符".   
  3. |   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;

结合方向

运算符

,

or

xor

and

print

= += -= *= /= .= %= &= |= ^= ~= <<= >>=

? :

||

&&

|

^

&

== != === !==

< <= > >=

<< >>

+ – .

* / %

! ~ ++ — (int) (float) (string) (array) (object) @

[

new

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » PHP学习笔记运算符优先级

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡