首页 > php运算符优先级示例

php运算符优先级示例

2012-08-05   hisenKing

网上看到部分关于php运算的题目,很容易使人想当然,部分也不完全遵循php的优先级。 题目如下: 1.
<?php
  $a = 22;
  $b = 33;
  if( $a = 5 || $b = 7 )
  {
     $a++;
     $b++;
  }
?>
以上$a,和$b分别等于多少 2.
<?php
   $arr = array(1=>'php', 3=>'mysql');
   $i = 2;
   $out = 'hisen'.isset($arr[$i]) ? $arr[$i] : $i;
?>
以上输出什么? 3.
<?php
  $a = 2;
  echo $a == 2 ? 'hisen' : $x == 1 ? 'mysql' : 'php';
?>
以上输出什么? 4.
<?php
$address = $where or $address = 'hangzhou';
?>
然后在看下php手册上运算符优先级的描述: 运算符优先级
结合方向运算符附加信息
非结合 clone newclone 和 new
[ array()
非结合 ++ -- 递增/递减运算符
非结合 ~ - (int) (float) (string) (array) (object) (bool) @类型
非结合 instanceof 类型
右结合 ! 逻辑操作符
* / % 算术运算符
+ - . 算术运算符 和 字符串运算符
<< >> 位运算符
非结合 < <= > >= <> 比较运算符
非结合 == != === !== 比较运算符
& 位运算符 和 引用
^ 位运算符
| 位运算符
&& 逻辑运算符
|| 逻辑运算符
? : 三元运算符
= += -= *= /= .= %= &= |= ^= <<= >>= 赋值运算符
and 逻辑运算符
xor 逻辑运算符
or 逻辑运算符
, 多处用到
不难发现其中的第一到题目没有遵循优先级的定义 其中的结果等同于
<?php
  $a = 22;
  $b = 33;
  if( $a = (5 || $b = 7) )
  {
     $a++;
     $b++;
  }
?>
因此$a为true;$b等于34。可能会问为什么$a不是2呢,不是已经递增了么? 因为“ 递增/递减运算符不影响布尔值。递减 NULL 值也没有效果,但是递增 NULL 的结果是 1。 ” 第二题由于字符串运算"."优先级高于三元运算符。因此echo中等同于
$out = ('hisen'.isset($arr[$i])) ? $arr[$i] : $i;
'hisen'.isset($arr[$i]永远为true,结果输出"Notice: Undefined offset" 第三题等同于
<?php
  $a = 2;
  echo ($a == 2 ? 'hisen' : $x == 1) ? 'mysql' : 'php'; // mysql
?>
第四题为php经典示例的代码类似:
$connect = mysql_connect(*) or die (mysql_error);
代码等同于
$address = empty($where) ? 'hangzhou' ; $where;
好久没更新了,需要除除草