运算符与错误控制符@

错误控制符@

php支持一个错误运算符:@。当将其放置在一个PHP表达式之前,该表达式可能产生任何错误信息都被忽略掉。不建议使用。

运算符

官方文档

运算符优先级:

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

括号的使用可以增加代码可读性

  • 递增/递减运算符不影响布尔值

    (也就是递增递减 true 和false)

  • 递减NULL 没有效果

  • 递增NULL值为1

递增和递减在前就先运算符后返回,反之就先返回,后运算。

$a = true;
if($a++) {
    echo "true1";  // 执行
}

if($a--) {
    echo "true2"; // 执行
}
$b = false;
if($b++){
    echo "false1"; // 不执行
}
var_dump($b);   // false
if($b--){
    echo "false1"; // 不执行
}
var_dump($b);   // false

 $c = null;
echo --$c;
var_dump($c); // null
echo ++$c; // 输出 1

特别注意短路作用:

当逻辑与时,如果前面为false,则后面不做执行

当逻辑或,如果前面为true,则后面不在做执行

//相等比较 > 逻辑与 && > 逻辑或 || > 赋值
echo $a = true || $b == 3  // true
echo $b = false && $a==1 //false

//逻辑与 && > 逻辑或 || > 赋值 > and > or 

echo $a = false || true;  // true
echo $b = false or true // true

实例:

下列程序中请写出打印输出的结果:

$a = 0;
$b = 0;

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

结果:

boolean true
int 0
1 1

解析:

1.优先级 :比较运算符(>) || > 赋值运算

2.按照以上逻辑, 3 > 0 为true,继续查看为逻辑或,逻辑或的原则是i前为true,则逻辑结果即可返回true,后面不在执行

3.因此$a 拿到了逻辑运算后的true,而$b没有执行,仍然为0

4.前面说过对一个boolean类型的值进行递增/递减不会影响布尔值 ,因此

  • $a的值不发生改变,输出被强制转为1.

  • $b=0;$b++;则为1

拓展

  • 判断int型变量a是奇数还是偶数:a&1 = 0 偶数 a&1 = 1 奇数

  • 乘法运算转化成位运算:a * (2^n) 等价于 a<< n

  • 除法运算转化成位运算:a / (2^n) 等价于 a>> n

  • 不用temp交换两个整数x ^= y; y ^= x; x ^= y;

  • 二进制位掩码,提供了一种用一个选项表示多项的可能。(参考:error_reporting设置错误级别的方式)

Error_Reporting(E_Error | e_Warning | e_Parse | e_Notice);
error_reporting(E_ALL ^ E_NOTICE);

Last updated