永发信息网

PHP短路运算理解不了,求指导

答案:4  悬赏:0  手机版
解决时间 2021-03-31 16:40
  • 提问者网友:
  • 2021-03-31 01:26
PHP短路运算理解不了,求指导
最佳答案
  • 五星知识达人网友:十鸦
  • 2021-03-31 01:46
忍不住出来回答一个;
$a=4;
$b=15;

if($a=5||$b=5){ //关键是这里;主要要理解一个短路运算的问题;执行步骤为:
//1,因为优先级的问题先运算5||$b结果为true;

//2,再算$a=true;注意后面不会运算,因为短路了;

//3,返回true给if;

//这里$b=5不会进入运算;

//给你个好点的例子吧;如果这里变成if($a=5||new pdo){ 这里的结果并不会改变,步骤是:1,先运算new pdo;因为new优先级最高;2,运算5||null,这里也是判断5为真后面也不最执行了;3,$a=true;

$a++; //true ++最后还是true
$b++; //因为$b没进入运算,所以15 ++ 最后是15;
}
echo $a,',',$b; //1,16
var_dump($a); //true追问这里我也知道由于优先级的原因,$b不再计算。我问的是if里的$a=5既然为ture为啥是1,不是5,也就是问逻辑运算符与比较运算符的结果只有真和假,他们到底有什么特性。上面if(($a=8)||($b=9)这段代码中$a=8也为真,返回的结果值也为真,值是8,这段代码中$b=9也会不再执行也是短路。我要问的是这里为啥会是8,下面那个没有括号的为啥就是1.....同样是真追答这个关键靠理解;
$a=5;
(boolean)$a; //这里转换了$a的数据结构返回结果为bool(true);但$a本身的数据结构没有变化;值传递
var_dump($a); //int(5)
$a=5;
settype($a,'boolean); //这里是实际转换了$a的数据类型,引用传递
var_dump($a); //bool(true)

你好好理解上面的例子;也就是说if()语法结构括号里面不会真的转换数据类型的,只是把表达式的运算结果用于判断,但表达是里面有个赋值运算$a=true;相当于直接对$a进行重新赋值;追问我也动手试了一下,第一段代码if(($a=8)||($b=9))这里面查看$a的值类型是整形;第二段代码if($a=5||$b=5)这里面查看$a的值是布尔值。如果把第二段代码的两个表达式都加上括号,再查看$a的值,也会是整形。所以这里的问题是原则上逻辑判断返回真或假。但事实上已经说了,第一段代码直接返回的是整形,下面运算中返回值整形直接参与运算,第二段代码中返回的是布尔值,结果就直接显示成1.追答5||$b的返回的结果是直接赋给$a的,如果没有$a,变成if(5||$b=5)括号里面的表达式的结果也会是true;
比如上面的那个例子;if($a=($a=8)||($b=9));这里的的$a一样会变成的true;追问越说越晕。。。。。。。。我实际上也var_dump了一下if里的数据类型。第一段代码if(($a=8)||($b=9))里运行的结果就是整型,第二段代码if($a=5||$b=5)运行结果就是布尔值。而一些热心的网友解答是。第一段代码作赋值运算,第二段代码由于“||(或)”比“=”的优先级要高,就直接先算"||"运算,一旦判定为真就直接返回布尔值。不去考虑=。
全部回答
  • 1楼网友:第幾種人
  • 2021-03-31 04:21
你去看下 布尔值 是什么东西吧。追问布尔值不是数据类型吗?只有真或假,1为真,0为假,但是我还是不理解,真就真呗,第一段代码:if($a1||1),那第二段代码说的是什么意思,我一个都没看明白:第二个:|| 的优先级 高于 = 故 if($a=5||$b=5)的执行顺序:5||$b (为真)if语句变为 if($a=1=5)= 的运算顺序为从右至左,接下来执行的是1=5 (为假)if语句变为if($a=0)所以$a 的最后结果为1
  • 2楼网友:几近狂妄
  • 2021-03-31 04:06
因为你if里面打错了$a=5是赋值 永远为真 应该是$a==5才对 赋值运算的优先级最低 你加个括号就是你想的6了,他先用5||$b 为1 5=1为0 然后$a=0 然后$a++ 为1 逻辑判断一定要加括号啊 要不优先级会绕死人的追问
怎么可能?
你的回答我不能理解耶追答($a=5||$b=5) 这个
第一步 系统计算5||$b为真(1)
第二步 计算 上一步的真(1)=5 赋值不成功为假(0)
第三步 第二步的假(0)赋值给$a 结果$a =0 赋值成功 结果为真
进入if内部
然后$a++ 结果$a为1啊

基本来说因为||的优先级高于= 所以先计算|| 因为你的编译器可能是右面优先的,在优先级相同的情况下先计算右面的 = 再计算左面的= 就是这个结果了
不同的编译器 有的从左到右 有的从右到左 结果也会不一样的

这东西也就刚学的时候看看后面肯定得加括号的 要不就是作死啊...换个环境结果就不一样了追问还是不明白,为真为什么就是1,/*$a=3;
$b=5;
if(($a=8)||($b=9)){
$a=$a+1;
$b=$b+1;
}
*/这里$a=8也为真,它的值为什么是8,不是1呢,赋值运算符的返回值的返回结果是它本身,怎么可能是1呢?你把我说糊涂了。。。。。。。。
  • 3楼网友:蕴藏春秋
  • 2021-03-31 03:12
第一个:
首先括号会提升优先级,if(($a=8)||($b=9))的执行顺序:
$a=8 (为真)
$b=9 (为真)
if语句变为if(1||1)
第二个:
|| 的优先级 高于 = 故 if($a=5||$b=5)的执行顺序:
5||$b (为真)
if语句变为 if($a=1=5)
= 的运算顺序为从右至左,接下来执行的是
1=5 (为假)
if语句变为if($a=0)
所以$a 的最后结果为1,$b为16
关于php的运算顺序可查看
http://php.net/manual/zh/language.operators.precedence.php追问布尔值只有真或假,1为真,0为假,但是我还是不理解,真就真呗,第一段代码:if($a1||1),那第二段代码说的是什么意思,我一个都没看明白:第二个:|| 的优先级 高于 = 故 if($a=5||$b=5)的执行顺序:5||$b (为真)if语句变为 if($a=1=5)= 的运算顺序为从右至左,接下来执行的是1=5 (为假)if语句变为if($a=0)所以$a 的最后结果为1
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯