一起源码网

  • www.171739.xyz
  • 全球最大的互联网技术和资源下载平台
搜索
猜你喜欢
查看: 7643|回复: 1
打印 上一主题 下一主题

有关php运算符优先级的简单试题

[复制链接]

0

主题

0

帖子

1万

积分

钻石会员

Rank: 8Rank: 8

积分
17424
QQ
跳转到指定楼层
楼主
发表于 2020-4-3 09:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天正好群里有人在问一道php运算符优先级的问题,正好以前也遇到过类似的问题,这里整理一下吧,方便大家理解 以防掉坑:)

先来道简单的:

$a = 3;

if ($a = 5) {
$a++;
}
var_dump($a);// (int)6
所以一个好的编码习惯 对于数字来说 最好把它放前面写成 5 == $a 这样即使你写成了 5 = $a 此时会报错 不会是隐式的赋值
来,我们接着看下一个坑.
$x = 2;
echo $x == 2 ? '我' : $x == 1 ? '你' : '它'; //你
掉坑里的同学可能认为结果是我, 因为$x确实等于2 根据三元运算符的规则 ?前为true就输出我了.
这里的知识点在于运算符优先级以及三元运算符左结合的特性,其实真正的执行流程是这样的:
$x = 2;//将2赋值给变量x 没啥说的
echo $x == 2 ? '我' : $x == 1 ? '你' : '它'; //你
//因为 == 的优先级比三元运算符高 所以转换成如下代码
#echo true ? '我' : false ? '你' : '它';
//由于三元运算符左结合的特性 所以如上代码等效于
#echo (true ? '我' : false) ? '你' : '它';
//先计算左边括号里的
#echo '我' ? '你' : '它'; //到这里大家应该明白了吧
嗯,继续围观坑
$a = 3;
$b = 5;
if ($a = 3 || $b = 7) {
$a++;
$b++;
}
var_dump($a);//(bool)true
var_dump($b);//(int)6
这题相信不少同学在做面试题的时候应该会遇到过,我第一次做的时候也被坑了。
被坑的同学相信答案大概有这么几种(4,6),(2,6)
$b基本没啥争议,关键是$a到底是神马情况,来我们来讲解一下这个坑。
#赋值 没啥说的
$a = 3;
$b = 5;
if ($a = 3 || $b = 7) {
$a++;
$b++;
}
//知识点1: ||的优先级比=高
//所以$a = 3 || $b = 7 等效于 $a = (3 || $b = 7)
//因为3 || $b = 7整个表达式为真 所以返回true 赋值给$a 此时$a = true, 将执行括号里的内容
//知识点2: 递增/递减运算符不影响布尔值。递减 NULL 值也没有效果,但是递增 NULL 的结果是1
//也就意味着$a依然是true,不会是1++之后的2 $b依然++
//所以结果是$a是true,$b是自增之后的6

这里掉坑的同学会认为是3. 注意=号是赋值 == 比较运算符

分享到:  QQ好友和群QQ好友和群
收藏收藏
回复

使用道具 举报

0

主题

8

帖子

26

积分

新手上路

Rank: 1

积分
26
沙发
发表于 2022-9-17 15:47 | 只看该作者
怎么下载原图
回复

使用道具 举报

一起源码让程序更轻更快

www.171739.xyz

工作时间 周一至周六 8:00-17:30

侵权处理

客服QQ点击咨询

关注抖音号

定期抽VIP

Copyright © 2016-2021 https://www.171739.xyz/ 滇ICP备13200218号

快速回复 返回顶部 返回列表