5.1.概述:
5.1.1.含义
就是对数据进行某种所需要的运算的语法符号,比如加减乘除,或比较大小,或判断真假。
5.1.2.按参与运算的数据的个数来分类
单目运算符:
只需要一个数据——但必须是变量。
双目运算符:
需要两个数据——可以是变量,也可以直接的数据本身。
三元运算符:
需要3个数据才能运算,也称为三目运算符。
只有一个三元运算符。
5.1.3.按功能分类
赋值运算符:
算术运算符:
- – * / %
连接运算符:
.
自赋值运算符:
+= -= *= /= %= .=
自操作运算符:
++ —
比较运算符:
> >= < <= == != === !==
逻辑运算符:
&&(与) ||(或) !(非)
条件运算符:
数据1 ? 数据2 : 数据3
位运算符:
& | ~
其他:
@,是错误抑制符
( ),括号,用于提升运算优先级,括号中的先运算。
##5.2.赋值运算符
只要理解一个核心的观念:
就是将等号(=)右边的数据(可能是运算结果数据)赋值给左边的变量。
看看以下写法:
php
$v1 = 1;
$v2 = 2;
$v3 = $v1 + $v2;
$v1 + $v2 = $v3; //可以吗?不可以!
if( $v1 + $v2 = $v3 ){....} //可以吗???还是不可以!
一定记住,一个等号的左边,只能是一个“变量名”!
所以,这个写法是错误的: \(v1+2 = \)v2 + 3
##5.3.算术运算符
针对数字进行的算术计算,包括:+ – * / %
%:对整数数字进行“取余操作”——如果不是整数,会先自动转换为整数之后再进行取余。
转换为整数的做法是:直接去掉小数部分
比如:
$v1 = 10 % 4; //结果为2
$v2 = 10.8 % 3.6 //结果为1
如果不是数字,会自动转换为数字进行。
举例:
$v1 = 3 + “4”; //7
$v2 = “3” + “4”; //7
$v3 = “3” + “4.5”; //7.5
$v4 = 3 + “4abcd”; //7
$v5 = “3ab” + “4cd”; //7
$v6 = 3 + “abc4”; //3
$v7 = “ab3” + “cd4”; // 0
$v8 = “ab” + “cd”; //0
$v9 = 3 + true; //4 true转为数字,为1
$v10 = 3 + false; //3 false转为数字,为0
演示:
$v2 = 10.8 % 3.9;
var_dump($v2);//int(1)
连接运算符( . )
就是字符串的连接,能够将前后字符连接起来。
如果不是字符串,会自动转换为字符串。
$v1 = “ab” . “cd”; //’abcd’
$v2 = $v1 . “ef”; //’abcdef’
$v3 = “ab” . 12; //“ab12”
$v4 = 12 . 34; //”1234”
$v5 = “12” . true; //“121”,true转为字符串,为“1”;
$v6 = “12” . false; //“12”,false转为字符串,为“”(即空字符串);
5.5.自赋值运算符
针对数字的,包括: += -= *= /= %=
针对字符串的,只有一个:.=
形式:
\(变量 += 数据;
相当于这个赋值语句: \)变量 = $变量 + 数据;
$v1 = 1;
$v1 += 2; //3, 相当于: $v1 = $v1 + 2;
此时,其实是相当于该变量的值,跟给定的数据进行运算后的结果数据,再放回到该变量中(覆盖了之前的数据)。
演示:
5.6.自操作(自加自减)运算符
针对数字,只有2个:++ —
属于单目运算符,即只要一个变量就可以进行运算。
形式:
$变量++; //对该变量中数据+1
$变量--; //对该变量中数据-1
++$变量; //对该变量中数据+1
--$变量; //对该变量中数据-1
++讨论:
表示对该变量进行“自加1”操作。即该变量中的数据加1。
前自加:先自加,后取值;后自加:先取值,后自加;
举例1:
常见自加与赋值的混合运算:
自加自减总结
1,前自加,后自加,对变量本身的结果都是加1,没有区别。
2,但前自加、后自加如果跟别的运算符一起运行,此时区别为:
前自加:先自加,后取值(然后去进行其他运算);
后自加:先取值,后自加(然后去进行其他运算);
5.7.比较运算符
是针对数字的大小进行比较的运算。
如果不是数字,会自动转换为数字。
包括:
> >= < <= == != === !==
所有比较运算符,运算的结果只有两个可能(之一): true 或 false
比如:
if( 1 == 2); //结果是false
等于()和全等于(=)的区别:
通常,等于(==)也会用“模糊相等”或“松散相等”的说法。
两个数据“基本相等”(类型可能会发生自动转换),就算是相等。
1 == “1” //true
0 == false; //true
true == 1 //true
2.0 == 2; //true
全等于(===)就是完全相等:
只有两个数据的数据类型一样,并且其值也一样的时候,才是全等。
1 === “1” //false
0 === false; //false
true === 1 //false
2.0 === 2; //false
1 !== “1” //true
0 !== false; //true
true !== 1 //true
2.0 !== 2; //true
不等于: !=
两个数据不满足“==”这个运算结果,不等于(!=)的结果就是true,比如:
if( 1 != 2 ) //true
不全等于:!==
两个数据不满足“=”这个运算结果,不全等于(!)的结果就是true,比如:
if( “1” !== 1 ) //true
5.8.逻辑运算符
针对“布尔值”进行的运算,只有3个:
与: &&
或: ||
非: !
如果不是布尔值,会自动转换为布尔值去进行运算。
因为布尔值只有2个,不管怎么排列组合,最终只有以下10种情况的计算,几乎就是公式化。
5.8.1.逻辑与(&&):
含义:
表示两个条件(数据)的真假结果是否同时为真的共同作用结果。
运算结果:只有两个条件都为真的时候,结果才是真(true)。
只有如下4种情况:
true && true 结果为 true
true && false 结果为 false
false && true 结果为 false
false &&false 结果为 false
总结归纳出逻辑与(&&)的真值表(就是公式,类似99乘法表):
可见:逻辑与运算的结果,只有两个是真,才是真。
实际应用中,往往是以“条件”的面目出现,而不是简单的真假值
案例:
给定一个任意整数,请判断该数是否能被3整除并且还能被5整除!
$v1 = 18;
if( $v1 % 3 == 0 && $v1 % 5 == 0 ){....}
5.8.2.逻辑或(||)
含义:
表示两个条件(数据)的真假结果的是否存在“真”的情况的共同作用结果。
运算规则:
只要有任意一个条件为真(true),结果就是真。
- 只有如下4种情况:
true || true 结果为 true
true || false 结果为true
false || true 结果为 true
false ||false 结果为 false
- 总结归纳出逻辑或(||)的真值表(就是公式,类似99乘法表):可见:逻辑或运算的结果,只要有一个是真,就是真。
- 实际应用中,往往也是以“条件”的面目出现,而不是简单的真假值,比如:
$v1 = 18; //请判断该数是否能被3整除或能被5整除!
if( $v1 % 3 == 0 || $v1 % 5 == 0 ){....}
- 案例:
给定一个整数表示年份,请判断该年份是否为闰年。
(注:闰年是能被4整除但不能被100整除的年,或者能被400整除的年。)
<form action="" method="post">
请输入年份:<input type="text" name="year">
<input type="submit" value="判断">
if( !empty($_POST['year']))
{
$year = $_POST['year']; //永远是字符串!
if(is_numeric($year))
{
$year2 = (int)$year;//转换为整数
if($year2 == $year) //如果原数和转换后的数相等,说明就是整数
{
if($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0)
{echo $year . "是闰年。";}
else
{echo "{$year}不是闰年。";} //用大括号包裹变量
}
else
{echo "年份应该为整数!";}
}
else
{echo "请输入整数!";}
}
else
{echo "<font color='red' >请输入年份</font>";}
5.8.3.逻辑非(!):
- 就是对一个布尔值进行“取反”操作,规则为:
!true 结果为false
!false 结果为true
- 逻辑非(!)在if中的常见应用情形:
if( !isset( $v1 ) ){.... //如果$v1为空(null)
if( !empty( $v1 ) ){...} //如果$v1不为空(empty)
//对应的两个相反的情形是:
if( isset( $v1 ) ){....} //如果$v1存在
if( empty( $v1 ) ){...} //如果$v1为空(empty)
- 区分两个“空”:
null: “真空”,什么都没有,是明确定义的“没有数据”的一种写法(含义)
empty:“现实意义上的没有”,就是无,就是0,等等,常见的,
认为是empty的数据有:
“”(空字符串), 0, 0.0, “0”, false, null, 空数组,
还是查手册》附录》类型比较表:
5.8.4.逻辑运算的短路规则:
短路的基本概念:
就是对于“逻辑与” 或 “逻辑或”这两种运算符,他们可能会只进行左侧的逻辑判断之后,立即就中断后续(右侧)的判断,而得出整个逻辑运算符的运算结果!
- 逻辑与的短路:
php
if ( 左侧判断 && 右侧判断 ) //此时,如果左侧判断为false,则右侧判断不再进行
- 逻辑或的短路:
php
if ( 左侧判断 || 右侧判断 ) //此时,如果左侧判断为true,则右侧判断不再进行
- 示例:
假设给定一个整数表示一个员工的年龄,如果该年龄为整十的数,或者年龄的平方除以100在10~20之间,则公司在当年年底会给该员工发特别奖。请写出程序来判断某个年龄的员工是否可以得奖。
// 假设给定一个整数表示一个员工的年龄,
// 如果该年龄为整十的数,
// 或者年龄的平方除以100在10~20之间,
// 则公司在当年年底会给该员工发特别奖。
// 请写出程序来判断某个年龄的员工是否可以得奖。
$age = 20; //当age为20,30,就会发生短路
if($age % 10 == 0 || $age*$age/100>=10 && $age*$age/100<= 20)
{
echo "<br>可以得奖";
}
else
{
echo "<br>不可以得奖";
}
echo "<br>再来一个写法:";
//这个,对于32也会短路
if($age*$age/100>=10 && $age*$age/100<= 20 || $age % 10 == 0)
{
echo "<br>可以得奖";
}
else
{
echo "<br>不可以得奖";
}
结论:
我们应该将我们可能发生短路运算的逻辑判断的前后判断语句,做如下调整:
相对简单的运算放前面(左侧),相对复杂的运算放后面(右侧)。
对于逻辑或的短路运算,道理一样。
5.9.条件运算符
只有一个条件运算符,形式为:
表达式1 ? 表达式2 :表达式3
含义:
如果表达式1为true(或自动转换后为true),则运算的结果值为表达式2,否则为表达式3。
举例:
$score = 77; //分数
$v1 = $score >= 60 ? “及格” : “不及格”;//结果为”及格”
其本质是:
$score = 77; //分数
if ( $score >= 60 ){
$v1 = “及格”;
}
else{
$v1 = “不及格”;
}
5.10.位运算符(了解)
针对整数进行的二进制级别的运算。
基本位运算符包括:按位与( & ), 按位或( | ), 按位非( ~ ), 按位异或(^
5.10.1.位运算基本运算规则:
位运算符有如下基本运算规则:
(只针对二进制的0和1这两个数据的基本位运算规则):
按位与(&)运算规则:
0 & 1 结果为:0
0 & 0 结果为:0
1 & 0 结果为:0
1 & 1 结果为:1
结论:只有两个都是1,按位与运算结果才是1
按位或(|)运算规则:
0 | 1 结果为:1
0 | 0 结果为:0
1 | 0 结果为:1
1 | 1 结果为:1
结论:只有两个都是0,按位或运算结果才是0
按位非(~):
~1结果为0
~0结果为1
按位异或():
0 ^ 1 结果为:1
0 ^ 0 结果为:0
1 ^ 0 结果为:1
1 ^ 1 结果为:0
规则是:相同为0,不同为1
5.10.2.整数的按位与(&)运算
含义:
是针对整数的二进制值进行的位运算结果。
将两个整数的二进制值的每一个对应位上的二进制数字进行对应的按位与运算
$v1 = 6 & 8; //这里,虽然是普通整数,但其内部是按该整数的二进制形式进行位运算
运算规则:
将6和8的二进制数字的每一个对应位上的数字(0或1)进行基本的按位与(&)的运算所得到的结果。
结果:0
再来一个:
$v2 = 7 & 9;
结果:1
还有整数的其他位运算:
按位或,按位左移,按位右移。
5.10.3.按位左移运算
$v1 = 8 << 2; //8是要进行左移运算的整数,2是表示要进行移动的位数
含义:
将8这个数的二进制形式的数字的所有位都往左边移动2位,最右边空出部分填0(补0),最左边部分就会有2位“冒出去”了,也不要处理(不管),这样移动后,所得到的二进制数就是结果。
分析如下:
结果:1*25 = 32
再来一个:
$v2 = 11<<3
结果:126 + 0 + 124 + 1*23 + 0 + 0= 64 + 0 + 16 + 8 = 88
总结:
将一个整数左移n位,就是相当于将该数乘以2的n次方。
5.11.错误抑制符@
含义:
在一个表达式出现错误的时候,可以将错误“隐藏”(掩盖)起来(不输出)!
通常,该符号,用于在实际运行环境中的一些条件非我们(程序员)所能控制的情形。
如果出现该情形并报错,则我们可以抑制该错误的显示(只是该错误不显示,不是没有错误了)。
典型应用场景:
if( @mysqli_connect(‘localhost’, ‘root’, ‘123’ ) ){
.......
}
加上抑制符后:
/错误抑制符
if(@mysqli_connect('localhost','root','1234'))
{
echo "成功!";
}
else{
echo "连接失败";
}
5.12.运算符的优先级
运算符优先级不得不说的规则:
- 1,时刻意识到,运算符有优先级问题!
- 2,小括号可以改变运算的顺序(即括号最优先)
- 3,先乘除(以及取余)后加减;
- 4,大致有如此优先级规则:算术运算 > 比较运算 > 逻辑运算
- 5,赋值运算符通常都是最后(优先级最低)