上一篇: 变量类型的转换
下一篇: 选择结构if语句-流程控制语句
在程序中,经常会对数据进行运算,php提供了多种类型的运算符,即专门用于告诉程序执行特定运算或逻辑操作符号。根据运算的作用,可以将php语言中常见的运算符分为九类。
运算符类型 | 作用 |
算术运算符 | 用于处理四则运算 |
字符串运算符 | 用于连接字符串 |
赋值运算符 | 用于将表达式的值赋给变量 |
递增或递减运算符 | 用于自增或自减运算 |
比较运算符 | 用于表达式的比较,并返回一个真值或假值 |
逻辑运算符 | 用于根据表达式的值返回真值或假值 |
位运算符 | 用于处理数据的位运算 |
错误控制运算符 | 用于忽略因表达式运算错误而产生的错误信息 |
instanceof | 用于判断一个对象是否是特定类的实例 |
每一种类型的运算符的作用都不同。运算符是用来操作数据,因此,这些数据也被称作操作数,使用运算符金操作数链接而成的式子称为表达式,表达式具有以下特点:
1. 常量和变量都是表达式,如,常量3.14,变量$a。
2. 每一个表达式都有自己的值,即表达式都有运算符。
算术运算符用于对数值类型的变量及常量进行算数运算。与数学中的加减乘除类似
运算符 | 运算 | 范例 | 结果 |
+ | 正号 | +1 | 1 |
- | 符号 | -2 | -2 |
+ | 加 | 1+2 | 3 |
- | 减 | 2-1 | 1 |
* | 乘 | 1*1 | 1 |
/ | 除 | 2/2 | 1 |
% | 取模(即算术中的求余) | 7%5 | 2 |
算数运算符比较简单,也容易理解,但在实际运用中还是有很多需要注意的问题:
1. 进行四则混合运算时,运算顺序遵循数学中的先乘除后加减的原则。
2. 当有浮点参与运算时,运算结果类型总是浮点型,如,0.2+0.8的结果是float(1)当整型与整数运算的结果是小数时,其数据类型也是浮点型。
3. 取模运算在程序中广泛运用,例如,判断奇偶数的方法是求去一个数字除以2的余数是1还是0,运算的结果正负取决于被模数(%左边的数)的符号,与右边(%右边的数)的符号无关,如(-5)%3=-2而5%(-3)=2
赋值运算符的作用是将常量、变量或者表达式的值赋给一个变量。
运算符 | 运算 | 范例 | 结果 |
= | 赋值 | $a=1;$b=2; | $a=1;$b=2; |
+= | 加等于 | $a=3;$b=2;$a+=$b | $a=5;$b=2 |
-= | 减等于 | $a=3;$b=2;$a-=$b; | $a=1;$b=2; |
*= | 乘等于 | $a=3;$b=2;$a*=$b | $a=6;$b=2 |
/= | 除等于 | $a=3;$b=2;$a/=$b | $a=1.5;$b=2 |
%= | 模等于 | $a=3;$b=2;$a%=$b | $a=1;$b=2 |
.= | 链接等于 | $a='abc';$a.='def'; | $a='abcdef' |
“=”的作用不是表示相等的关系,而是赋值运算符,即等号右侧的值赋给等号左侧的变量
在赋值运算符使用中,需要注意以下几个问题:
(1) 在php中可以通过一条赋值语句对多个变量进行赋值
<?php
$a;
$b;
$c;
$a=$b=$c=5;
?>
由于赋值运算符的结合行为“从右到左”,即先将5赋值给变量c,然后把变量c赋给b,最后把变量b赋给变量a,表达式赋值完成。
(2) 特殊赋值运算,如“+=”
<?php
$a=2;
$a+=3;
?>
上述代码中,执行代码$a+=3后,a的值为5。表达式的过程为:
①先将a的值和3进行相加
②将相加的结果赋给变量a
所以表达式$a+=3相当于$a=$a+3,先进行相加运算,在进行赋值。“+=、-=、*=、/=、%=”都可以此类推。
(3)“.=”表示对两个字符串进行连接操作,生成一个新的字符串赋值给变量,也称为字符串运算符
<?php
$a="abc";
$a.="def";
echo $a; //结果为$a="abcdef";
?>
递增递减运算符可以看做是一种特定形式的符合赋值运算符,它可可以对数字类型变量的值进行加1或减1
在进行自增(++)或自减(--)运算时:
如果运算符(++或--)放在操作数的前面则是先进行自增或自减,再进行其他运算。
如果运算符(++或--)放在操作数的后面则是先进行其他运算在进行自增或自减。
在php语言中,对操作数进行递增递减操作时,操作类型是不确定的,不同类型的操作执行数执行递增或递减时,会有不同的结果。
1. 递增递减数字当操作数为数字时,每次操作都会将值加1或减1。
运算符 | 运算 | 范例 | 结果 |
++ | 自增(前) | $a=2;$b=++$a; | $a=3;$b=3; |
++ | 自增(后) | $a=2;$b=$a++; | $a=3;$b=2; |
-- | 自减(前) | $a=2;$b=--$a; | $a=1;$b=1; |
-- | 自减(后) | $a=2;$b=$a--; | $a=1;$b=2; |
案例
<?php
$x=2;
//输出不同情况下的$x
echo '<br/>x='.$x++;
echo '<br/>x='.$x;
$y=1.6;
echo '<br/>y='.++$y;
echo '<br/>y='.$y;
?>
运行结果
可以看出两次输出的$x的值不同,这是因为在第4行代码中,程序首先返回$x的值。然后进行递增操作,使$x+1,因此第5行的输出结果为3.
两次$y的值相同,因为在第8行,首先程序先将变量$y的值加1,然后将加1后的结果赋给$y,最后输出$y,第9行未对$y进行其他操作,所以$y的值不变。
2.递增递减字符字php中,只支持纯字母(A-Z和a-z)的递增运算,其他字符递增运算是无效的。如,我们无法对“#”这样的字符进行递增递减操作。
程序输出结果为a、b、aa、AA、abd。这是因为在php中,当对字符进行递减时,该操作是无效的,并且操作数值不变。当z或Z以前的单字符进行操作时,字符会按照英文字母排列顺序递增,字符会向前一位变成aa或AA。同理,当对多个字母组成的字符进行递增操作时,会针对字符串末尾的单个字符进行递增。
需要注意的是,字符变量只能递增,不能递减,并且只支持纯字母。递增或递减对其他字符变量是无效的,原字符串不会变化。
3.递增递减布尔值或null当操作数为布尔值时,递增递减操作对其不产生影响。
但操作数为null时,递增结果为1,递减结果不受影响
比较运算符用于对两个数值或变量进行比价,其结果是一个布尔值,即true和false。
运算符 | 运算 | 范例 | 结果 |
== | 等于 | $x=5;$x==4; | FALSE |
!= | 不等于 | $x=5;$x!=4 | TRUE |
<> | 不等于 | $x=5;$x<>4 | TRUE |
=== | 恒等 | $x=5;$x===5 | TRUE |
!== | 不恒等 | $x=5;$x!=='5' | TRUE |
> | 大于 | $x=5;$x>5 | FALSE |
>= | 大于或等于 | $x=5;$x>=5 | TRUE |
< | 小于 | $x=5;$x<5 | fasle |
<= | 小于或等于 | $x=5;$x<=5 | TRUE |
其中“===”和“!==”比较符是比较少见的。
当$x===$y为true时,说明x,y不只数值相等,而且两者的类型也一样。
当$x!==$y为true时,说明x,y要么数值不相等,要么数据类型不相等。
逻辑运算符用于对布尔类型的数据进行操作,其结果仍是一个布尔型。
运算符 | 运算 | 范例 | 结果 |
&& | 与 | $a && $b | $a和$b都为true,结果为true,否则为false |
|| | 或 | $a || $b | $a和$b中至少有一个为true,结果为true,否则为false |
! | 非 | !$a | 若$a为false,结果为true,否则相反 |
xor | 异或 | $a xor $b | $a和$b的值一个为true,一个为false是,结果为true,否则为false |
and | 与 | $a and $b | 与&&相同,但优先级较低 |
or | 或 | $a or $b | 与||相同,但优先级较低 |
在实际开发中,逻辑运算法也可以针对结果为布尔值的表达式进行运算。如,$x>3&&$y!=0;
位运算符是针对二进制的每一位进行运算的符号,它专门针对数字0和1进行操作。
运算符 | 运算 | 例子 | 结果 |
& | 按位与 | $a & $b | $a和$b每一位进行“与”操作后的结果 |
| | 按位或 | $a | $b | $a和$b每一位进行“或”操作后的结果 |
~ | 按位非 | ~ $a | $a的每一位进行“非”操作后的结果 |
^ | 按位异或 | $a ^ $b | $a和$b每一位进行“异或”操作后的结果 |
<< | 左移 | $a << $b | 将$a左移$b次(每一次移动都表示“乘与2”) |
>> | 右移 | $a >> $b | 将$a右移移$b次(每一次移动都表示“除与2”) |
在PHP中,位运算符既可以对整型类型数据进行计算,还可以对字符进行为运算。
<>1. 当运算符左右参数均为数字时在对数字进行位运算之前,程序会降所有的操作转换成二进制数,然后在进行逐位运算。
(1)位运算“&”是将参与预算的两个二进制数进行“与”运算,如果两个二进制位都为1,则该位的运算结果为1,否则为0
<?php
$a=8;
$b=13;
$c= $a & $b;
echo $c; //输出结果为8
/*
*如果两个二进制位都为1,则该计算结果为1,否则为0
*计算过程,8的二进制00001000,13的二进制00001101
* 00001000
* & 00001101
* -----------------
* 结果 00001000
* 00001000对应值为为8
*/
?>
(2)位运算符“|”是将参与运算的两个二进制数进行“或”运算,如果二进制上有一个值为1,怎该结果为1,否则为0
<?php
$a=8;
$b=13;
$c= $a | $b;
echo $c; //输出结果为13
/*
*如果二进制上有一个值为1,怎该结果为1,否则为0
*计算过程,8的二进制00001000,13的二进制00001101
* 00001000
* | 00001101
* -----------------
* 结果 00001101
* 00001101对应值为为13
*/
?>
(3)位运算符“~”只针对一个操作数进行操作,如果二进制位是0,则取反值为1,如果是1,则取反值为0
<?php
$a=8;
$c= ~$a;
echo $c; //输出结果为-9
/*
*计算过程,8的二进制00001000
* ~ 00001000
* -----------------
* 结果 11110111
* 11110111对应值为为-9
*/
?>
(4)位运算符“^”是将参与运算的两个二进制数进行“异或”运算,如果二兼职位相同,则值为0,否则为1
<?php
$a=8;
$b=13;
$c= $a ^ $b;
echo $c; //输出结果为5
/*
*如果二进制上有一个值为1,怎该结果为1,否则为0
*计算过程,8的二进制00001000,13的二进制00001101
* 00001000
* ^ 00001101
* -----------------
* 结果 00000101
* 00000101对应值为为5
*/
?>
(5)位运算符“<<”就是将操作数所有二进制位向左移动一位,运算时,右边的空位补0,左边移走的部分舍去。
<?php
$a=8;
$b=1;
$c= $a<<$b; //将变量$a向左移动$b位
echo $c; //输出结果为16
/*
*将操作数所有二进制位向左移动一位,运算时,右边的空位补0,左边移走的部分舍去
*计算过程,8的二进制00001000,
* 00001000 <<1
* -----------------
* 结果 00010000
* 00010000对应值为为16
*/
?>
(6)位运算符“>>”就是将操作数所有二进制位向右移动一位,运算时,左边的空位根据原数的符号补0或者1(原来是负数就补1,是正数就补0)
<?php
$a=8;
$b=1;
$c= $a>>$b; //将变量$a向右移动$b位
echo $c; //输出结果为4
/*
*将操作数所有二进制位向右移动一位,运算时,左边的空位根据原数的符号补0或者1(原来是负数就补1,是正数就补0)
*计算过程,8的二进制00001000,
* 00001000 >>1
* -----------------
* 结果 00000100
* 00000100对应值为为4
*/
?>
2当左右参数均为字符时
在对字符进行位运算之前,首先将字符转换成对应的ASCLL码(数字),然后对产生的数字进行上述运算,再把运算结果(数字)转换成对应的字符。
如果两个字符串长度不一样,则从两个字符串的起始位置开始计算,之后多余的自动转换为空(视为一样)
下面以字符b和字符d的“或运算”为例
<?php
$a='b';
$b='d';
$c= $a | $b;
echo $c; //输出结果为f
/*
*b对应的ASCLL码值为66,二进制为01000010
*d对应的ASCLL码值为68,二进制为01000100
* 01000010
* | 01000100
* --------------
*结果 01000110
*01000110 对应值为70,该值对应的ASCLL码表示字符为f
*/
?>
php的错误控制运算符使用@符号来辨识,把它放在一个php表达式之前,将忽略该表达式可能产生的错误。
$a=@4/0;
如未使用错误控制符,代码会产生一个除以0的警告信息,使用@操作后,警告信息不会显示出来。
但需要注意的是,@运算符自对表达式有效。例如可以把它放在变量、函数和include()调用、常量之前,但不能把它放在函数或类的定义之前。
在对一些比较复杂的表达式进行运算时,首先要明确表达式中所有运算符参与运算的先后顺序,我们把这种顺序称为优先级。
优先级 | 结合方向 | 运算符 | 附加信息 |
1 | 无结合 | clone、new | clone 和 new |
2 | 从右向左 | ** | 算术运算符 |
3 | 从右向左 | ++、--、~、(int)、(float)、(string)、(array)、(object)、(bool)、@ | 类型、递增/递减、错误控制 |
4 | 无结合 | instanceof | 类型 |
5 | 从右向左 | ! | 逻辑运算符 |
6 | 从左向右 | *、/、% | 算术运算符 |
7 | 从左向右 | +、-、. | 算术运算符和字符串运算符 |
8 | 从左向右 | <<、>> | 位运算符 |
9 | 无结合 | <、<=、>、>= | 比较运算符 |
10 | 无结合 | ==、!=、===、!==、<>、<=> | 比较运算符 |
11 | 从左向右 | & | 位运算符和引用 |
12 | 从左向右 | ^ | 位运算符 |
13 | 从左向右 | | | 位运算符 |
14 | 从左向右 | && | 逻辑运算符 |
15 | 从左向右 | || | 逻辑运算符 |
16 | 从右向左 | ?? | null 合并运算符 |
17 | 从左向右 | ? : | 三元运算符 |
18 | 从右向左 | =、+=、-=、*=、**=、/=、.=、%=、&=、|=、^=、<<=、>>= | 赋值运算符 |
19 | 从左向右 | and | 逻辑运算符 |
20 | 从左向右 | xor | 逻辑运算符 |
21 | 从左向右 | or | 逻辑运算符 |
其中,同一行的是运算符具有相同的优先级,左结合方向表示将统计运算符执行顺序从左向右。右结合方向则表示执行顺序从右向左。
在表达式中,还有一种优先级最高的运算符:圆括号();在表达式外围放置一对圆括号,可以提高括号内部运算符优先级,这样可以避免复杂的运算符优先级法则,让代码更为清楚,并且避免一些错误。
<?php
$a=5+2*2; //输出结果9
$b=(5+2)*2; //输出结果14
?>
按照优先级原则,变量$a,乘“*”级别高于加“+”,所以优先计算乘号。变量$b使用圆括号后,会先强制计算括号里的表达式(5+2),然后在计算乘号。
在程序中,表达式可以使用任意多个括号,并且最里层的优先级级别最高。需要注意的是“or”比“||”的优先级低,“and”比“&&”优先级低,在程序开发中,倾向于使用“||”和“&&”运算符,以及使用括号来设定特定的运算符顺序。
上一篇: 变量类型的转换
下一篇: 选择结构if语句-流程控制语句
*声明:内容来源于网络收集和整理,版权归原著所有,如来源信息有误或侵犯权益,请联系站长作修改和删除处理。