$num = 10; $res = ++$num + ++$num; echo $res.'<br>'; //23 $num = 10; $res = ++$num + $num++; echo $res.'<br>'; //22 $num = 10; $res = $num++ + ++$num; echo $res.'<br>'; //22 $num = 10; $res = $num++ + $num++; echo $res.'<br>'; //21 $num = 10; $res = $num + $num++; echo $res.'<br>'; //21 $num = 10; $res = $num + ++$num; echo $res.'<br>'; //22 $num = 10; $res = ++$num + $num; echo $res.'<br>'; //22 $num = 10; $res = $num++ + $num; echo $res.'<br>'; //21
有个问题:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //删除数组中的空值 2 $arr = ['','a','s',2,' ','0',0]; 3 print_r($arr); 4 5 foreach($arr as $k=>$v){ 6 if(trim($v) == ''){ 7 unset($arr[$k]); //foreach加上trim之后就不会把整型的0 删除掉,为什么?而for循环的那个加不加trim都不会删除整型的0. 8 } 9 } 10 print_r($arr); 11 12 $arr = ['','a','s',2,' ','0',0,0]; 13 print_r($arr); 14 $len = count($arr); 15 $n = []; 16 17 for($i=0;$i<$len-1;$i++){ 18 if(trim($arr[$i]) == ''){ 19 unset($arr[$i]); //不会把整型的0删除 20 } 21 } 22 print_r($arr); 23 24 $arr = ['','a','s',2,' ','0',0,0]; 25 print_r($arr); 26 foreach($arr as $k=>$v){ 27 if($v == ''){ 28 unset($arr[$k]); //会把整型的0 当做 '' 删除 29 } 30 } 31 print_r($arr); 32 //为什么for循环不会删除整型0,而foreach遍历的会把整型0删除?(在不使用===情况下)foreach加上trim之后就不会删除整型的0 为什么?? 33 //也可以使用array_filter();配合回调函数把没有具体值的字符串过滤掉。
现在终于弄明白了,今天回顾一下这个问题,有了思路。之前没有考虑运算符优先级的问题。根据手册运算符优先级,可以知道++优先级高于+。所以对于$res = $num + $num++; 会先计算$num++,后边的num会先使用它的值,然后++运算,前边的num值就随着后一个num++而改变。也就是说是11+10;而前后都有++运算符的时候,就是按照从左至右的顺序依次计算。
在举例子把:$num + ++$num; 就是11+11;
如果运算符优先级相同,那运算符的结合方向决定了该如何运算。没有结合的相同优先级的运算符不能连在一起使用,例如 1 < 2 > 1 在PHP是不合法的。
++$a ;a的值先加1,在返回a. $a++ 先返回a的值,在加1.