运算符优先级指定了两个表达式绑定得有多“紧密”。例如,表达式 1 + 5 * 3 的结果是 16 而不是 18 是因为乘号(“*”)的优先级比加号(“+”)高。必要时可以用括号来强制改变优先级。例如:(1 + 5) * 3 的值为 18。
如果运算符优先级相同,其结合方向决定着应该从右向左求值,还是从左向右求值——见下例。
下表按照优先级从高到低列出了运算符。同一行中的运算符具有相同优先级,此时它们的结合方向决定求值顺序。
结合方向 | 运算符 | 附加信息 |
---|---|---|
无 | clone new | clone 和 new |
左 | [ | array() |
右 | ++ -- ~ (int) (float) (string) (array) (object) (bool) @ | 类型和递增/递减 |
无 | instanceof | 类型 |
右 | ! | 逻辑运算符 |
左 | * / % | 算术运算符 |
左 | + - . | 算术运算符和字符串运算符 |
左 | << >> | 位运算符 |
无 | == != === !== <> | 比较运算符 |
左 | & | 位运算符和引用 |
左 | ^ | 位运算符 |
左 | | | 位运算符 |
左 | && | 逻辑运算符 |
左 | || | 逻辑运算符 |
左 | ? : | 三元运算符 |
右 | = += -= *= /= .= %= &= |= ^= <<= >>= => | 赋值运算符 |
左 | and | 逻辑运算符 |
左 | xor | 逻辑运算符 |
左 | or | 逻辑运算符 |
左 | , | 多处用到 |
对具有相同优先级的运算符,左结合方向意味着将从左向右求值,右结合方向则反之。对于无结合方向具有相同优先级的运算符,该运算符有可能无法与其自身结合。举例说,在 PHP 中 1 < 2 > 1 是一个非法语句,而 1 <= 1 == 1 则不是。因为 T_IS_EQUAL
运算符的优先级比T_IS_SMALLER_OR_EQUAL
的运算符要低。
传送门:http://www.php.net/manual/zh/language.operators.precedence.php
略速互联网笔记原创:
PHP是弱类型语言,在运算过程中会因为运算的顺序对中间变量的数据类型造成影响,起因是同事发的这个例子:
<?php
$a=1;
$b=&$a;
$c=(++$a)+(++$a)+(++$a);
var_dump($c);
输出是10而不是9,原因是当$b=&$a时,$a的数据类型变为了引用,当做运算操作时,++$a返回的是一个引用类型,做第一个加法运算时,相当于两个引用类型指向相同数据的变量相加,这时该数据由于已经做了两次自增操作,相当于执行了3+3结果为6,注意此时6的结果为一个数,所以算式继续执行的相当于6+(++$a) = 6+4 既结果为10;
同样,可以是测试如下代码:
$b=&$a;
$a=1;
var_dump(0 + (++$a) + (++$a));
$a=1;
var_dump(0 + ( (++$a) + (++$a) ) );
还有:
$b=&$a;
$a=1;
var_dump( ( (++$a) + (++$a) ) + (++$a) );
$a=1;
var_dump( (++$a) + ( (++$a) + (++$a) ) );
甚至:
$b=&$a;
$a=1;
var_dump( ( (++$a) + (++$a) + (++$a) ) + (++$a) );
$a=1;
var_dump( (++$a) + ( (++$a) + (++$a) + (++$a) ) );
$a=1;
var_dump( ( (++$a) + (++$a) ) + ( (++$a) + (++$a) ) );
$a=1;
var_dump( (++$a) + ( (++$a) + ( (++$a) + (++$a) ) ) );
转载请注明出处:http://www.lvesu.com/blog/main/cms-15.html
最新评论: