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

/**$a=3;$b=5;if(($a=8)||($b=9)){$a=$a+1;$b=$b+1;}echo$a,'~',$b,'<br/>';**/这段代码,逻辑或判断只... /**
$a=3;
$b=5;
if(($a=8)||($b=9)){
$a=$a+1;
$b=$b+1;

}
echo $a,'~',$b,'<br/>';
**/
这段代码,逻辑或判断只要有一个为真就执行。$a=8(赋值运算,返回值就是8,所以输出$a=$a+1,最后$a=9)。但下面这段代码就不明白了
/**
$a=4;
$b=15;

if($a=5||$b=5){

$a++;
$b++;
}
echo $a,',',$b;
**/这里$a=5(赋值运算,它的返回值应该是5啊,然后执行下面的$a++,我认为应该是6啊。为啥最后结果竟然是1呢,$b最后结果是16倒是能理解),求详细解答,望通俗易懂,谢谢
第二段代码吧,=比||运算级低,但是还是先执行$a=5吧,它为真,返回的值应该是5,又如何说if($a=1)?第一
段代码$a=8,if里的会什么不是$a=1,而是8?我也明白第一段代码if里多了个()。这些都是网友解答,下面是官方解释的图片,官方的解释还是不懂
展开
 我来答
百度网友adbe004
2014-09-19 · TA获得超过172个赞
知道小有建树答主
回答量:123
采纳率:71%
帮助的人:79.3万
展开全部
忍不住出来回答一个;
$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进行重新赋值;
云峰cool
2014-09-19 · 超过21用户采纳过TA的回答
知道答主
回答量:48
采纳率:0%
帮助的人:34.1万
展开全部
第一个:
首先括号会提升优先级,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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
为啥啊不能重名
2014-09-19 · TA获得超过459个赞
知道小有建树答主
回答量:889
采纳率:0%
帮助的人:321万
展开全部
因为你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啊

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

这东西也就刚学的时候看看后面肯定得加括号的 要不就是作死啊...换个环境结果就不一样了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
黄世航啊
2014-09-19 · 超过43用户采纳过TA的回答
知道小有建树答主
回答量:238
采纳率:40%
帮助的人:77.1万
展开全部
你去看下 布尔值 是什么东西吧。
追问
布尔值不是数据类型吗?只有真或假,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)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式