算术运算符:+、-、*、/、%、++、--
注意:取余运算符%,先取整,再取余。对比js中,不会进行取整处理
示例:
$v1=7.5%3;//结果为1
$v1=7.5%3.5; //结果为1
对比js
var v1=7.5%3; //结果为1.5
var v2=7.5%3.5;//结果为0.5
自增自减运算符++、--
1.常规:对数字进行自加1或自减1
2.字符串:只能自增,且自增效果是“下一个字符”
3.布尔值自增自减无效
4.null递减无效,递增结果为1
示例:
$s1=”ABC”;
$s1++;//$s1为“ABD”
++$s1与 $s1++的区别:
++$s1,先完成变量的递增运算,再取得该变量的值参与别的运算。
$s1++,先将原来变量的值临时存储,再将变量值递增,最后再将临时存储的值参与别的运算
注意:独立语句中自加运算,两者没有区别。放在别的语句中,会有区别,++$s1比$s1++效率略高,建议在循环中使用++$s1
示例:
v1=10;
v2=10;
$s1=++v1;
$s2=v2++;
结果:s1=11 ,s2=10,v1=11,v2=11
比较运算符
包括:> < >= <= ==(松散相等) ===(严格相等) != !===
==与===的区别:
==松散相等,比较的是两个数据“类型转换后”是否有可能相等,常常认为是“数据内容是否相同”
===严格相等,全等,只有两个数据的类型和数据内容都完全一致,才相等
注:特别常用的转换(不管是自动转换还是强制转换),就是字符串转换为数字:
”5“==》5 //整数
”5.5“==》5.5 //浮点数
”5abc“==》5 //整数
”5.5ab“=》5.5 //浮点数
”abc5“=》0 //整数
”abc“=》0 //整数
” “=》0 //整数
参考:参考手册》附录》类型比较表
常见不同类型的比较(只要指标量数据)
有布尔值,转为布尔值比较
有数字转为数字比较
两边都是纯数字字符串,转为数字比较
否则按字符串比较,字符串的比较按字符的先后顺序依次一个一个的比较,发现哪个大,则表示整体大,后续不再进行比较。
示例:”abc35“>”abc123“ true(遵循字符比较规律)
逻辑运算符
都是针对布尔类型的值进行运算,如果不是,就转成布尔值
逻辑与&&:只有两个都是true,结果才是true
逻辑或||:只要有一个是true,结果就是true
逻辑非!
短路现象(短路现象用于优化性能,将较复杂的程序放在后边)
逻辑与短路:
$S1>2 && $s2>1 当$S1>2的结果是false时,后续不再进行计算,称为”短路现象“。
逻辑或短路:
$S1>2 || $s2>1当$S1>2的结果是true时,后续不再进行计算,称为”短路现象“。
字符串运算符
只有一个:.
衍生一个:.=
会将运算符两边的数据转化为字符串
对比js:+(具有双重含义,加法或链接字符串)
赋值运算符
只有一个:=
衍生多个:+= -= *= /= %= .=
基本形式为:$变量赋值运算符 数据;
条件(三目)运算符:至少需要3个数据参与
形式为:数据1?数据2:数据3;(数据1作为布尔值来使用)
含义:如果数据1为true,那运算结果为数据2,否则运算结果为数据3
可转换为if-else语句实现
位运算符
位运算符的基本规则:
1.位运算符都是针对整数的二进制数字形式而进行的
2.按位与运算规则&:只有同时为1时,结果为1
3.按位或运算规则|:有一个1时,结果为1
4.按位非运算~:~1为0,~0为1
5.按位异或运算^: 相异为1
按位与运算 &
形式:A&B //A、B都为数字,其实是常规的10进制数,系统会按二进制计算
含义:将A和B的二进制形式的每一个位上的二进制数字进行按位与&运算之后的结果。
按位或运算 |
形式:A}B //A、B都为数字,其实是常规的10进制数,系统会按二进制计算
含义:将A和B的二进制形式的每一个位上的二进制数字进行按位或|运算之后的结果。
按位左移运算:<<
形式:A<<n; //A是一个要被移动的数字,按二进制取运算,n是要移动的位数
含义:将数字A的二进制形式的每一个位上的数字往左边移动指定的位数n,则最左边的n为移出去后就不管了,最右边空出来的n位,补0
按位右移运算:>>
形式:A>>n; //A是一个要被移动的数字,按二进制取运算,n是要移动的位数
含义:将数字A的二进制形式的每一个位上的数字往右边移动指定的位数n,则最右边的n为移出去后就不管了,最右边空出来的n位,补0(对正数来说,实际是补符号位)
按位非:将一个数字的二进制形式的每一个数字取反所得到的结果
按位异或:将两个整数的二进制形式的每一个对应数字进行异或运算后的结果
应用:管理一组对象(事物)的开关状态
开关状态:就是某种数据,它有2个值可用:true,false,1,0等
一组事物指:多个数据的任意可能的出现状态
我们假设有5个灯泡的开关需要管理:
1.确定每个灯泡的状态:开,关;
2.可以指定打开任意一个灯泡;
3.可以指定关闭任意一个灯泡;
设定前提:这5个灯泡有明确的顺序,我们将设定5个变量(常量其实也行)
假设1-5个灯泡的位置是从右往左边数—对应数字的位数
第一个灯泡:$d1=1; //00000001
第二个灯泡:$d2=2; //00000010
第三个灯泡:$d3=4; //00000100
第四个灯泡:$d4=8; //00001000
第五个灯泡:$d5=16; //00010000
则所有灯泡的总的状态,就可以使用一个变量来描述,如:
$state =7; //00000111 表示第1,2,,3灯泡亮
确定一个灯泡的开关状态:
$s1=$state & $dn; //这里n表示1-5之间的任意一个
结果大于0,则该灯泡亮,否则表示灭
打开指定的灯泡:
$state=$state | $dn; //这里n表示1-5之间的任意一个
关闭指定的灯泡:
$state= $state & ~$dn; //这里n表示1-5之间的任意一个
示例:
const D1=1;
const D2=2;
const D3=4;
const D4=8;
const D5=16; //表示5个原始数据
$state=13; //表示所有灯的总状态
showAll($state);
//打开第二个
$state =$state | D2;
echo ”打开第2个灯泡后:”;
showAll($state);
//关闭第1个
$state =$state & ~D1;
showAll($state);
function showAll($state){
echo “<p>”;
for($i=1;$i<=5;++$i){
$temp=”D”.$i;
$r1=$state &constant($temp);
If($r1>0){
echo “灯{$i}亮”;
}else{
echo “灯{$i}灭”;
}
}
echo “</p>”;
}
原码、反码、补码(二进制数)
1.第一位为符号位,0代表正数,1代表负数
2.正数的反码是其本身,负数的反码,就是将原码的非符号位,每一位取反
3.正数的补码是其本身,负数的补码,就是将原码的非符号位,每一位取反,整体加1(即反码加1)
总结:
1.数据在CPU内都是按补码计算
2.原码、反码、补码的转换时系统内部的工作,且转换时符号位不变
3.用补码运算时,符号位参与运算(即当作一个普通的二进制位的数字进行运算)
数组运算符
联合(+):将右边的数组项合并到左边数组的后面,得到一个新数组,如果有重复键,则结果以左边的为准。
示例:
$v1=array(1,2,3,4);
$v2=array(5,6,7,8,9);
$r1=$v1+$v2; //结果是array(1,2,3,4,9)
相等(==):如果两个有相同的键名和键值(可以顺序不同,或类型不同),则返回true
示例:
$v1=array(1,2,3,4);
$v2=array(4,3,2,1);
$v3=array(3=>4,1=>2,0=>1,2=>3);
此时:$v1与$v2相等吗? 不相等
此时:$v1与$v3相等吗? 相等
注意:php中,数组元素的顺序,不是有下标(键名)决定的,而是完全由加入的顺序来决定。
错误控制运算符@
通常用于一个”可能“发生错误的表达式的前面—最常用的情形是连接数据库
示例:
$link=@masql_connect(“localhost”,”root”,”1234”)or die(“数据库连接失败”);
//如果连接成功,不执行die语句,否则执行。or也是逻辑运算符,通常只用在这种位置
用在程序开发测试阶段无法预测的可能出错的位置—一般是获取外部资源的时候
运算符的优先级问题
括号最优先,赋值最落后,先乘除后加减,大致:算术运算符>比较运算符>逻辑运算符(除了非运算)