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视图: <!--在视图中调用无返回值的方法,视图中调用无返回值的方法,要加上大括号--> <!--在一个视图中,直接加载另外一个视图--> @ ...
随机推荐
- 网易免费/付费163企业邮smtp服务器地址
免费:smtp.ym.163.com 25/pop.ym.163.com 110 付费:smtp.qiye.163.com 25/pop.qiye.163.com 110
- ADC/DAC的一些参数
1.LSB,Least Significant Bit LSB是指最低位一个bit的权值,比喻ADC是一把尺子,那LSB则是它的最小刻度.LSB=Vfs/(2^N),Vfs为full scale vo ...
- Swift Swift中的反射
Swift的反射机制是基于一个叫 Mirror 的 struct 来实现的,其内部有如下属性和方法: let children: Children //对象的子节点. displayStyle: Mi ...
- Spider爬虫清洗数据(re方法)
import re s0 = 'BOY and GIRL' s1 = re.sub(r'BOY|GIRL', 'HUMAN', s0) print s1 # HUMAN and HUMAN 替换方法.
- STL之deque用法详解
C++ Deque(双向队列): Deque是一种优化了的.对序列两端元素进行添加和删除操作的基本序列容器.它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用 ...
- Linux以外的开源操作系统大汇总
开源操作系统即公开源代码的操作系统软件,它遵循开源协议使用.编译和发布.自由和开放源代码软件中最著名的是Linux,它是一种类Unix的操作系统.Linux可安装在各种计算机硬件设备中,比如手机.平板 ...
- 和redis谈一场恋爱(第一天邂逅)
前几天玩了下Memcache,发现挺好用.知道redis是Memcache的妹妹.我本着大公无私和博大的胸怀,看着redis孤零零的躺在角落里,委实觉得可怜.心里总有个声音在说,你既然已经爱上了Mem ...
- 深入理解JavaScript中的属性和特性
深入理解JavaScript中的属性和特性 JavaScript中属性和特性是完全不同的两个概念,这里我将根据自己所学,来深入理解JavaScript中的属性和特性. 主要内容如下: 理解JavaSc ...
- Docker入门教程(五)Docker安全
Docker入门教程(五)Docker安全 [编者的话]DockOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第五篇,介绍了Docker的安全问题,依然是老话重谈,入门者可以通 ...
- IBatis 构建 In语句
语句 <select id="qryProjectsByIds" parameterClass="Hashtable" resultMap="p ...