PHP运算符考察点

时间:2021-01-07 12:20:27

PHP运算符优先级

运算符优先级指定了两个表达式绑定得有多“紧密”。例如,表达式 1 + 5 * 3 的结果是 16 而不是 18 是因为乘号(*)的优先级比加号(+)高。必要时可以用括号来强制改变优先级。例如:(1 + 5) * 3 的值为 18

如果运算符优先级相同,那运算符的结合方向决定了该如何运算。例如,"-"是左联的,那么 1 - 2 - 3 就等同于 (1 - 2) - 3 并且结果是 -4. 另外一方面,"="是右联的,所以 $a = $b = $c 等同于 $a = ($b = $c)。

没有结合的相同优先级的运算符不能连在一起使用,例如 1 < 2 > 1 在PHP是不合法的。但另外一方面表达式 1 <= 1 == 1 是合法的, 因为 == 的优先级低于 <=

下表是php手册所给的运算符优先级:

PHP运算符考察点

总结常用的运算符优先级如下:

递增/递减 > ! > 算术运算符 > 大小比较 > (不)相等比较 > 引用 > 位运算符(^) > 位运算符(|) > 逻辑与 > 逻辑或 > 三目 > 赋值 > and > xor > or

比较运算符

== 和 ===的区别:

==:比较值是否相等;
===:比较值与类型是否都相等;

注意false的七种情况,都是等值的

递增/递减运算符

  • 递增/递减运算符不影响布尔值
    ture++ 还是 ture,false++也还是false
  • 递减NULL没有效果
  • 递增NULL值为1
  • 递增/递减在前就先运算再返回,在后就先返回再运算
    ++$a:先执行递增再返回递增后的值;
    $a++:先返回值再执行递增;

逻辑运算符

  • 短路作用
    $a = true || $b == 3;// || 后面的表达式被短路,不会执行
    $a = false && $b == 3;// && 后面的表达式被短路,不会执行
  • ||、&& 和 or、and 的优先级是不一样的
    $a = false || true; //"||"优先级大于"=",$a 的值是 true
    $a = false or true; // "or"优先级小于"=",$a 的值是 false

解题方法

重点记忆递增/递减运算符的运算规则,逻辑运算符的短路效果,在看到逻辑运算符时要多考虑优先级的问题。

真题

<?php
$a = 0;
$b = 0;

if ($a = 3 > 0 || $b = 3 > 0) {
    $a++;
    $b++;
    echo $a . "\n";
    echo $b . "\n";
}

思路:

/**
 * if里面有 = > || 三个运算符,根据运算符优先级, ">" > "||" > "=" 
 * 所以首先执行的是 3 > 0 ,然后执行 || ,3>0 为true,则|| 后面被短路 ,不被执行
 * 所以$a = true ,$b = 0
 * 进入if之后,$a++ ,$a还是true,$b++ ,$b = 1
 * 因此最后的结果是 1 1(echo true,打印的是1)
 */