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视图: <!--在视图中调用无返回值的方法,视图中调用无返回值的方法,要加上大括号--> <!--在一个视图中,直接加载另外一个视图--> @ ...
随机推荐
- 【bzoj3884】 上帝与集合的正确用法
http://www.lydsy.com/JudgeOnline/problem.php?id=3884 (题目链接) 题意 求 Solution 解决的关键: 当${n>φ(p)}$,有$${ ...
- css3中-moz、-ms、-webkit,-o分别代表的意思,以及微信浏览器内核分析
这种方式在业界上统称:识别码.前缀 //-ms代表[ie]内核识别码 //-moz代表火狐[firefox]内核识别码 //-webkit代表谷歌[chrome]/苹果[safari]内核识别码 // ...
- 环信webim1.1.2版本在windows下npm环境搭建错误解决
1.1.2版本的webim从ui到整体的代码结构都做了很大改变,从代码结构上采用node.js的环境进行开发和打包,最终打包的输出项目,不依赖node.js的环境进行运行,得益于webpack的打包实 ...
- TCP/IP详解 笔记十一
域名服务系统(DNS) DNS:名字到IP转换:电子邮件选路信息:分布式数据库 解析器:是通过gethostbyname(3)和gethostbyaddr(3)来实现的 最常用的名字服务器是BIND ...
- MOOCULUS微积分-2: 数列与级数学习笔记 Review and Final
此课程(MOOCULUS-2 "Sequences and Series")由Ohio State University于2014年在Coursera平台讲授. PDF格式教材下载 ...
- POJ1025 Department
POJ1025 是一道模拟题. 这题第一个障碍是现在少见的循环电梯 ('pater-noster' elevator) ”The building has `pater-noster' elevato ...
- .net图片验证码生成、点击刷新及验证输入是否正确
①创建ValidateCode.aspx,在ValidateCode.aspx.cs中加入如下代码.生成验证码图片,在页面上输出,输出jpeg格式. protected void Page_Load( ...
- 常见Android Native崩溃及错误原因
http://www.droidsec.cn/%E5%B8%B8%E8%A7%81android-native%E5%B4%A9%E6%BA%83%E5%8F%8A%E9%94%99%E8%AF%AF ...
- Linux/UNIX 定时任务 cron 详解
定时任务( job)被用于安排那些需要被周期性执行的命令.利用它,你可以配置某些命令或者脚本,让它们在某个设定的时间内周期性地运行.cron 是 Linux 或者类 Unix 系统中最为实用的工具之一 ...
- java Base64算法的使用
Base64是常见的网络加密算法,Base64编码可用于在HTTP环境下传递较长的标识信息.详见 Base64介绍 1 自定义的base64算法 Base64Encrypt.java public c ...