一个常见的优先级问题

9 篇文章 0 订阅
5 篇文章 0 订阅

优先级问题确实是比较让人郁闷的问题,有时候出错了,查找半天最后才发现是它的问题。下面这个问题也是很常见的一个。

<?php
$a = 3;
$b = 5;
if( $a = 5 || $b = 7 ) {
    $a++;
    $b++;
}
echo $a . ", " . $b;

a和b分别为什么呢?不运行 先猜一猜。

第一眼看上去 不假思索的话 相信很多人说是6, 8
然后稍加思索的话 可能会选 6, 6
然后再思索的话  可能结果是2, 6
当然 这只是我的臆测哈 然而最终结果是啥呢?运行一下结果显示: 1, 6

为什么会是1,6呢 我们一起分析一下流程。

赋值部分不用说了 简单的a = 3, b = 5;
然后关键就在于if条件语句了 即:a = 5 || b = 7;
我们知道优先级中 逻辑运算符|| 是高于 赋值运算符=的,那么以上的式子可以写成
a = 5 (||) b = 7
而我们又知道,这个式子是从左向右执行的,而且 赋值运算符的方向是 从右到左 ,于是这个式子可以转化为
a = ( 5 (||) b = 7 )


恩 这里也有个小陷阱哈, a 的值是什么呢?
我们应该知道,逻辑运算符是返回boolean类型结果的,那么,此处a的值就应该是true,而不是我们都认为的5。
而b呢? 再看5||b=7 逻辑运算符结构中方向也是从左至右的,那么5为true之后就不会往右执行,而直接返回true了,所以b不会被赋值。


接下来进入if的结构体中。
$a++;
$b++;
b是没问题的, 没有被覆盖, 所以还是开始被赋值的5, ++自增之后为6;
a呢? 这里就有个小知识点了.
首先我们已经知道a的值现在为true, 然后, 我们可以看看php手册关于运算符一节中-> 递增/递减运算符,
在开始部分有一个主意事项

  Note: 递增/递减运算符不影响布尔值。
  递减 NULL 值也没有效果,但是递增 NULL 的结果是 1。


所以, 在if的结构体中,a自增还是true。
所以, 最后echo结果为1, 6。

可以运行试一下哈 可以在if里面var_dump($a, $b);
也可以在echo前面var_dump($a, $b);
证明a的类型是bool(true)的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值