一、前言
能够实现某种运算功能的符号。
根据不同的功能,可以分为以下几大类:
1.算术运算符
2.赋值运算符
3.字符串运算符
4.比较运算符
5.递增/递减运算符
6.逻辑运算符
7.位运算符
8.错误控制运算符
9.三目运算符
不同的运算符所对应的的运算数是不同的,单目、双目、三目。一个运算符在进行运算的时候,需要确保运算数是一致的。
二、算数运算符
除法运算的结果,可能是浮点数,也可能是整数。
在取模运算中,如果有小数,则会去除小数部分。
在取模运算中,结果的正负取决于第一个数。
三、赋值运算符
赋值运算符就是 =
$a = ‘php’
[思考]:$a = ($b = 4) + 5; 这行代码如何理解? $a = 9
赋值运算表达式的值也就是所赋的值。也就是说,“$a = 3”的值是 3。
表达式也是有值的。
有时候我们还将 = 和其它的运算组合到一起,形成组合赋值。
$a = $a + 5 => $a += 5;
四、字符串运算符
字符串运算符只有一个,就是 点 . ,没有加号,
注意的是,点 和 赋值运算符一起 形成 组成赋值。
五、比较运算符
比较运算符,比较两个运算数的关系,返回的结果是一个布尔值。
不等有两种写法,!= 和<>
注意细节:
如果比较一个整数和字符串,则字符串会被转换为整数。如果比较两个数字字符串,则作为整数比较。
=== 和 == 的区别。比如 0 == false 返回真,而0 === false 返回假
六、递增递减运算符
++ 和 --
根据其位置的不同,又分为前++,前--,后++,后--
前置和后置的区别?
不管是前置还是后置,变量的结果是一致的。
不同的运算的顺序,通过表达式来分析,前置,++$b,是先进行运算,然后再得到值,
而后置$b++,则是先得到值,然后进行运算。
☞ 注意细节
递增/递减运算符不影响布尔值。递减 NULL 值也没有效果,但是递增 NULL 的结果是 1
七、逻辑运算符
与:两者都为true的情况才为true and
或:两者都为false的才为false or
非:非真即假,非假即真,直接取反。 !
异或:xor,如果两者相异,结果为真,两者相同,结果为假。
之所以出现 && 和and 两种运算符,是由于它们的优先级不同。
短路运算:
在进行逻辑运算的时候,如果通过第一个参数已经能够确定整个表达式的值,那么就不会进行后面的运算。
对于 与 运算,如果第一个为假,则后面的不会进行计算。
对于 或 运算,如果第一个为真,则后面的不会进行计算
真实的代码:
八、位运算
按位进行运算,
位,bit,是指二进制表示中的每一个数值。 010101
字节 Byte,是由位构成的,通常是8 bit 00001010
1KB = 1024 Byte
1MB = 1024 KB
1GB = 1024 MB
1TB = 1024GB
已知$a = 9,$b = -4,分别求: $a & $b, $a | $b, ~$b,$a ^ $b,$a >>2, $b<<2的值。
位运算都是以二进制的形式来出现的。
同时要注意,二进制的表示形式有 原码、反码、补码。
原码:
将十进制转成的二进制。用最高位表示符号位,0表示正数,1表示负数。
反码:
对于正数,反码和原码相同
对于负数,符号位不变,其它位取反。
补码:
对于正数,补码和原码相同
对于负数,在反码的基础上 + 1。
计算机在底层进行运算的时候,是以补码的形式进行的。Why?
$a & $b $a | $b的过程:
Ø 右移:低位溢出,符号位不变,高位用符号位补全 (相当于除以2n 然后取整)
Ø 左移:高位溢出,符号位不变,低位补0 (相当于乘以2n)
$a >> 2 和 $b << 2的运算过程:
不管是左移还是右移,它只会改变该数的大小,不改变符号,所以在移位操作的时候,符号位始终是不变的。
在实际编程的时候,经常会用一个位表示一种状态(或一个值)。
九、错误控制运算符
我们不期望看到错误,可以使用错误控制运算符进行屏蔽。
不是在每个会出现错误的地方使用这个运算,一般而言,对于我们无法控制的错误,比如去请求其它的资源的时候,可以使用。
☞ 注意细节
@ 运算符只对表达式有效。不能把它放在函数或类的定义之前,也不能用于条件结构例如 if 和 foreach 等。
十、三目运算符
从名字我们就可以得知,这个运算符有三个运算数。?
从名字我们就可以得知,这个运算符有三个运算数。? :
表达式1 ? 表达式2 : 表达式3
等价于一个简单的if……else语句
If (表达式1){
表达式2
} else {
表达式3
}
使用三目运算符可以简化程序。
☞ 注意细节
Ø 运算符优先级指定了两个表达式绑定得有多“紧密”。
Ø 同一行中的运算符具有相同优先级,此时它们的结合方向决定求值顺序。
Ø 必要时可以用括号来强制改变优先级。可以增强代码的可读性。
Ø && || 与 and or的区别
Ø 尽管 = 比其它大多数的运算符的优先级低,PHP 仍旧允许类似如下的表达式:if (!$a = foo()),在此例中 foo() 的返回值被赋给了 $a。
如果在编写代码的时候,对于运算比较复杂(运算符较多),可以使用()来改变优先级。