当前位置:博客首页>>PHP >> 阅读正文

【PHP】&&与and的’别名’关系

作者: 郑晓 分类: PHP 发布于: 2013-02-21 12:18 浏览(3,143) 评论(2)


这个应该是我们新手编程过程中一直忽略的一个细节:
&&、||与AND、OR一样吗?它们只是别名关系?

php执行源码时的整个过程为,首先按照zend_language_scanner.l中定义的,将源码中的echo、if之类的语言结构转换成类似的T_ECHO、T_IF这些token,并且会去掉源码中的空格,注释这些与程序逻辑无关的字符。,就形成了一些简短的表达式,这就是词法分析阶段。然后会按照zend_vm_opcodes.h中定义的,将这些token转换为op code。然后一条一行的执行这些op code。

上面大概解释了php的编译和执行的过程,以及语言结构的定义。下面进入正题。

我先坦白,之前我一直以为一样,以为是纯粹的别名关系。但今天看到源码后,发现完全是不同的token。拿&&和AND举例:

还是zend_language_scanner.l

<ST_IN_SCRIPTING>”&&” {
return T_BOOLEAN_AND;
}

<ST_IN_SCRIPTING>”AND” {
return T_LOGICAL_AND;
}

一个叫布尔”与”,一个叫逻辑”与”

之所以使用不同的token。那必然有不同之处。这里我也不卖关子了,google能找到很多答案,其实这两个最实质的区别就是优先级不同:

$a = 1 && 0;
$b = 1 AND 0;
var_dump($a);
var_dump($b);

前者会尝试先计算1 && 0,得到结果后再赋给$a,后者会先将1赋给$b;所以结果为
bool(false) int(1)

这下大家应该清楚这里的细节了,PHP中&&与AND还是存在一定差异的,用的时候需要注意下。

       

本文采用知识共享署名-非商业性使用 3.0 中国大陆许可协议进行许可,转载时请注明出处及相应链接。

本文永久链接: https://www.zh30.com/php-and-another-name.html

【PHP】&&与and的’别名’关系:目前有2 条留言

用户评论头像 三防漆发表于 2013年02月22日 14:22[回复]

不光是php里面是的,c语言等其他语言也是有区别的

    用户评论头像 郑晓发表于 2013年02月22日 14:27[回复]

    嗯,后来查了一下其实就是运算优先级的问题…基础没学好啊~~~