【PHP 语言】PHP中的运算符

摘要:运算符和变量一样,是计算机语言不可或缺的一部分。运算符(有时也称操作符)是命令解释器对一个或多个操作数(变量或数值)执行某种运算的符号。万丈高楼平地起,勿在浮沙筑高台。自身深知基础的重要性,也避免自己在以后学习的过程中只注重招式而不注重内功,本系列文章将以归零的心态,重新整理和思考PHP语言的基础。本篇文章主要总结了PHP运算符的分类和一些具体的应用,通过以解决某个问题的方式去归纳和思考其中的各个知识点。

运算符分类

根据操作数的个数分类,可分为一元运算符、二元运算符、三元运算符。

操作数的个数分类 说明
一元运算符 !true (逻辑取反运算符)、$a++ ( 递增运算符)
二元运算符 $a + $b(加法运算)
三元运算符 true ? 1 : 0

根据运算符的功能分类,可分为算术运算符、字符串运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、其他运算符(错误控制运算符、执行运算符运算符、数组运算符、类型运算符)。

功能分类 作用 运算符
算术运算符 常见的数学操作符,用来处理简单的算术运算。 +、-、*、/、%、++、--
字符串运算符(连接运算符) 连接多个字符串,合并成新的字符串。 .(英文的句号)
赋值运算符 常用的二元运算符,用于为新变量赋值,左边必须是变量,右边可以是一个表达式。 =、+=、-=、*=、/=、%=、.=
比较运算符 常用的二元运算符,用于对运算符两边的操作数进行比较,运算结果只能为布尔值。 >、<、>=、<=、==、===、<>或!=、!==
逻辑运算符 用来判断对错,是否成立,只能操作布尔型数值,返回结果也是布尔型数值。 and或&&()、or或||()、not或!()、xor(异或)
位运算符 位运算用于对操作数中的每一个二进制位进行运算,包括位逻辑运算符和位移运算符。 &(按位与)、| (按位或)、^(按位异或)、~(按位非)、<<(左移)、>>(右移)
其他运算符 用于特定功能的使用 ?:(三元运算符)、``(执行运算符)、@(错误控制运算符)、=>(数组下标指定符合)、->(对象成员访问符合)、instanceof(类型运算符)

运算符的优先级

级别 运算符 附加信息 结合方式
1 clone、new clone 和 new
2 [ array() 从左到右
3 ** 算术运算符 从右到左
4 ++ -- ~ (int) (float) (string) (array) (object) (bool) @ 数据类型和递增/递减 从右向左
5 instanceof 类型
6 ! 逻辑运算符 从右到左
7 * / % 算术运算符 从左到右
8 + - . 算术运算符和字符串运算符 从左到右
9 << >> 位运算符 从左到右
10 < <= > >= 比较运算符
11 == != === !== <> <=> 比较运算符
12 & 位运算符和引用 从左到右
13 ^ 位运算符 从左到右
14 位运算符 |从左到右
15 && 逻辑运算符 从左到右
16 | 逻辑运算符 |从左到右
17 ?? 比较运算符 从左到右
18 ? : ternary 从左到右
19 = += -= *= **= /= .= %= &= = ^= <<= >>= 赋值运算符 |从右到左
20 and 逻辑运算符 从左到右
21 xor 逻辑运算符 从左到右
22 or 逻辑运算符 从左到右

具体应用

运算符的优先级

运算符的优先级

题目1:

<?php
echo '2'.print(2)+3;

分析:
知识点1:题目中运算符优先级从高到低排序:()> +(算术运算符) > .(字符串运算符)。

知识点2:print是一个函数,它的返回值总是1,int print ( string $arg )

答案:521

题目2:

<?php
$x = 2;
echo $x == 2 ? 'a' : $x == 1 ? 'b' : 'c';

分析:
知识点1:比较运算符== 的优先级高于三元运算符? :的优先级。

知识点2: 三元运算符的结合方式为左结合。

知识点3: 比较运算符的结果只能为布尔类型,也就是truefalse

答案:b

题目3:

<?php
$a = 3;
$b = 5;
if ($a = 3 || $b = 7) {
    $a++;
    $b++;
}
var_dump($a);
var_dump($b);
if ($a = 3  && $b = 7) {
    $a++;
    $b++;
}
echo $a;
echo $b;

分析:

知识点1:逻辑运算符||优先级高于赋值运算符=,逻辑运算符的处理结果为布尔数值。

知识点2:递增/递减运算符不影响布尔值。递减NULL 值也没有效果,但是递增NULL 的结果是1。

知识点3:echo true 为1, echo false 为空。

知识点4:逻辑运算符and(&&)和or(||),存在短路的问题。

答案:(bool)true (int)6 1 8

比较运算符

比较运算符

题目1:

<?php
echo 'a' == 0;
print ('a' == 0);
var_dump( 'a' == 0);
var_dump('a' == (string)0 );
var_dump('a' === 0 );

知识点1:比较运算符==,只关心两个操作数的值是否相等,不关心类型是否一致。

知识点2:比较运算符===,即关心值相等也关心数据类型是否一致。

知识点3:print是一个函数,它的返回值总是1,int print ( string $arg )

知识点4:0 与任意不可转化为数字的字符串比较(操作符为==), 均返回 true

答案:1 1 bool(true) bool(false) bool(false)

题目2:

<?php
var_dump('1000000' < 'a'); 
var_dump('ba'>'az');
var_dump('a' < 1); 
var_dump('12abcd' < 11); 
var_dump('a' == 0);
var_dump(1 < '1000000');

分析:

知识点1:当两个字符进行大小比较时,是比较着这两个字符的ASCII码大小。

知识点2:当两个字符串进行大小比较时,是从第一个字符开始,分别比教对应的ASCII大小,只要从从某个对应位置开始,其中一个字符串的当前位置字符大于另一个字符串对应位置字符,即直接判别出这两个字符串大小。

知识点3:当一个数字与一个字符串/字符进行大小比较时,首先系统尝试将此字符串/字符转换为整型/浮点型,然后进行比较,如'12bsd'转型为12,'a'转型为0,千万需要注意的是此时不是将其对应的ASCII码值与数字进行大小比较了。

知识点4:0 与任意不可转化为数字的字符串比较(操作符为==), 均返回 true

答案:bool(true) bool(true) bool(true) bool(false) bool(true) bool(true)

位运算符

位运算符

题目1:

<?php
$a = 20;
$b = 30;
$c = 2;
$d = 4;

$and = $a & $b;
$or = $a | $b;
$xor = $a ^ $b;
echo '<br/>';
$not = ~$a;
$shiftLeft = $c << $d;
$shiftRight = $c >> $d;
$shiftRight2 = $d >> $c;
echo $and,$or,$xor,$not,$shiftLeft,$shiftRight,$shiftRight2;

分析:

知识点1:整数的二进制表示2^N.....2^4,2^3,2^2,2^1,2^0,求值后为2^N.....16,8,4,2,1。20的二进制表示为10100,30的二进制表示为11110。

知识点2:And按位与,将把 $a 和 $b 中都为 1 的位设为 1。

知识点3:Or按位或,将把 $a 和 $b 中任何一个为 1 的位设为 1。

知识点4:Xor按位异或,将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。

知识点5:Not按位取反,将 $a 中为 0 的位设为 1,反之亦然。

知识点6:Shift left左移,将 $c 中的位向左移动 $d 次(每一次移动都表示“乘以 2”)。

知识点7:Shift right右移,将 $c 中的位向右移动 $d次(每一次移动都表示“除以 2”)。

答案:20 30 10 -21 32 0 1

题目2:

<?php
$a = 20;
$b = ~$a;
var_dump($b);

分析:
知识点1:Not按位取反,将 $a 中为 0 的位设为 1,反之亦然。

知识点2:十进制转二进制,20%2,把得出余数的先后顺序反过来 。20转为二进制位10100。

按位取反过程:
十进制的20转为二进制:0001 0100
32位表示二进制:0000 0000 0000 0000 0000 0000 0001 0100
按位取反后结果:1111 1111 1111 1111 1111 1111 1110 1011
从左向右0正1符:-111 1111 1111 1111 1111 1111 1110 1011
补码的原码表示:-111 1111 1111 1111 1111 1111 1110 1010
补码取反为原码:-000 0000 0000 0000 0000 0000 0001 0101
二进制转化为十进制:-(16+4+1) = -21

答案:int(-21)

相关推荐

Leave a Reply

Your email address will not be published. Required fields are marked *

微信扫一扫,分享到朋友圈

【PHP 语言】PHP中的运算符
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close