PHP中逻辑运算符and/or与||/&&的一个坑
看以下代码:
- $bA = true;
- $bB = false;
- $b1 = $bA and $bB;
- $b2 = $bA && $bB;
- var_dump($b1); // $b1 = true
- var_dump($b2); // $b2 = false
- $bA = false;
- $bB = true;
- $b3 = $bA or $bB;
- $b4 = $bA || $bB;
- var_dump($b3); // $b3 = false
- var_dump($b4); // $b4 = true
奇怪吧, and/&&和or/||出来的结果竟然不一样的. 问题出在哪里呢?
我们再看一段代码!
- $bA = true;
- $bB = false;
- var_dump($bA and $bB); // false
- var_dump($bA && $bB); // false
- $bA = false;
- $bB = true;
- var_dump($bA or $bB); // true
- var_dump($bA || $bB); // true
更奇怪, 这时怎么是对的. 所以问题可能出现在=
上, 一番google和文档,终于找到了答案!
运算符优先级
通过这个表, 我们可以看到 and
/&&
和 or
/||
这两组运算符的优先级竟然是不一样的. and
和or
的优先级是低于=
的, 所以上面的代码就好理解了, 就是先做赋值然后再做了一个and
或or
的逻辑运算, 这个运算的结果并没有存下来. 所以最后出来让我们匪夷所思的结果.
The following table lists the operators in order of precedence, with the highest-precedence ones at the top. Operators on the same line have equal precedence, in which case associativity decides grouping.
下表列出了运算的优先级顺序, 越靠上的越高, 同一行的优先级相同. 相同优级的使用结合性进行分组处理.
结合性 | 运算符 | 额外信息 |
---|---|---|
无结合性 | clone new | 克隆和new |
左 | [ | 数组 |
左 | ** | 算术 |
右 | ++ — ~ (int) (float) (string) (array) (object) (bool) @ | 类型和自增/自减 |
无结合性 | instanceof | 类型 |
右 | ! | 逻辑运算 |
左 | * / % | 算术 |
左 | + – . | 算术和字符串 |
左 | << >> | 按位运算 |
无结合性 | < <= > >= | 比较运算 |
无结合性 | == != === !== <> | 比较运算 |
左 | & | 按位运算和引用 |
左 | ^ | 按位运算 |
左 | | 按位运算 | |
左 | && | 逻辑运算 |
左 | | | 逻辑运算 | |
左 | ?: | 三元条件选择 |
右 | = += -= *= /= .= %= &= | = ^= <<= >>= => | 赋值 |
左 | and | 逻辑运算 |
左 | xor | 逻辑运算 |
左 | or | 逻辑运算 |
左 | , | 很多使用 |
总结
慎重使用and
, or
和xor
的逻辑运算符, 避免和赋值号以及&&
和||
一起用, 以免发生不必要的逻辑错误.
PHP中逻辑运算符and/or与||/&&的一个坑的更多相关文章
- 记新人从 excel 文件中读取字典数据踩的一个坑
原本是打算今天分享一下最近学习接口自动化的心得体会,然而在我写模板的时候,却被一个坑拦我大半天,心得体会不得不 延期再分享了.在我无数次调试无数次看log,终于发现并解决这个问题了.下面记录一下踩的坑 ...
- html中a标签href属性的一个坑
由于公司需要,小菜最近在搞app web开发,目前只有ios和android版本,虽然仅此两个版本,但是依然要考虑浏览器兼容性问题,因为android和ios默认浏览器内核是不一样的. 先说说兼容性问 ...
- C中字符串分割函数strtok的一个坑
strtok的典型用法是: p = strtok(s4, split); while(p != NULL){ printf("%s\n", p); p = strtok(NULL, ...
- android studio中配置X5 webview时的一个坑
在接入X5的第二步中,需要配置so文件,这里说一下遇到的坑 1. 需要把demo下载回来,不然你找不到so文件,找到so文件后放到自己相对应的目录下边,自己里面那个目录也没有,所以和文件夹一起复制过去 ...
- node中通过orm2链接mysql的一个坑
代码是orm上的例子,出现如下错误: ORMError: Connection protocol not supported - have you installed the database dri ...
- 关于Java中的继承和组合的一个错误使用的例子
[TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...
- xcode中得一个坑
因项目需求变动,我必须在coredata中的WorkLogModel表中添加一个字段:抄送人.起初我给这个字段起名为copyPerson,一切准备就绪后,发现从数据库读取这个copyPerson时,第 ...
- JavaScript中sort方法的一个坑(leetcode 179. Largest Number)
在做 Largest Number 这道题之前,我对 sort 方法的用法是非常自信的.我很清楚不传比较因子的排序会根据元素字典序(字符串的UNICODE码位点)来排,如果要根据大小排序,需要传入一个 ...
- MVC中在一个视图中,怎么加载另外一个视图?
在RazorView.cshtml视图: <!--在视图中调用无返回值的方法,视图中调用无返回值的方法,要加上大括号--> <!--在一个视图中,直接加载另外一个视图--> @ ...
随机推荐
- UOJ20 解方程
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- android颜色代码
<?xml version="1.0" encoding="utf-8" ?> <resources> <color name=& ...
- CodeForces 209C Trails and Glades
C. Trails and Glades time limit per test 4 seconds memory limit per test 256 megabytes input standar ...
- android.content.SharedPreferences.edit()
今天在实现一个保存用户设置到SharedPreferences时,出现了一个不能将数据保存到SharedPreferences中的情况.经过仔细的分析得出: android.content.Share ...
- (原)String、StringBuilder、StringBuffer作为形参
今天在刷一道算法题时,突然遇到StringBuilder作为形参和String作为形参时,最终得出来的结果不同.故尝试了几个demo看看它们之间的区别. 当String类型作为参数时, public ...
- A.Kaw矩阵代数初步学习笔记 3. Binary Matrix Operations
“矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...
- javascript之标识(zhi)符、关键字与保留字
正确区分标识(zhi)符.关键字与保留字 我发现很多初学者往往弄不清楚这三者的区别,甚至会把标识符的“识(zhi)”读作识(shi),真是愧对小学的语文老师啊!!! 注意:在JavaScript中,所 ...
- python requests
快速上手http://docs.python-requests.org/zh_CN/latest/user/quickstart.html Requests 是使用 Apache2 Licensed ...
- Ps 技巧
一.动作(批处理) 二.让图片更清晰 三.标尺 四.画面还原 五.内容识别比例(改变身材) 六.移花接木 七.多人头像 八.多重曝光 九.突出肌肉线条或者脸部轮廓 十.给照片换一个天空 十一.制作光束 ...
- css属性设置
css在线编辑工具地址:http://tool.chinaz.com/Tools/CssDesigner.aspx 案例详情: http://dongtianee.sinaapp.com/index. ...