算术运算符
1、算术运算符:+、-、*、/、%。
2、递增/递减运算符:如$a++,$a--,++$a,--$a.
如:
代码如下 复制代码
三元运算符
(expr1) ? (expr2) : (expr3);
解释:如果条件“expr1”成立,则执行语句“expr2”,否则执行“expr3”。
以下语句的语法是正确的,它们以小解引号的方式忽略了第二或第三“元”:
代码如下 复制代码
$a>$b ? print yes : ;
$a>$b ? '': print 'no';
应该注意的是:在使用三元运算符时,建议使用print语句替代echo语句。
注意下列一串语句的理解:
代码如下 复制代码
$str = $_get['abc'] ? 'wangjinbo' : 'wjb';
这里不能理解为:当$str等于$_get['abc'] 时,赋值为 'wangjinbo' 否则赋值为 'wjb';因为一:判断相等应该用==;因原二:三元算符的语法是如上所示:(expr1) ? (expr2) : (expr3),显然上面的二元,三元'wangjinbo'或'wjb'不能单独构成一个有意义的表达式;
正确理解是:当$_get['abc']为空(也就是否,php中 '',null,0,undifine,都等效布尔值false)时,将$str赋值为'wangjinbo',否则赋值为'wjb';
逻辑运算符:
如:
代码如下 复制代码
$a=10;$b=7;
if($a++>8 || $b++>7){ //$a++>8为真,$b++>7这个就不执行了
echo 'ok!';
}
echo 'a='.$a.'b='.$b; // 输出ok,a=11,b=7
改变一下
$a=10;$b=7;
if($a++>10 && $b++>7){ //$a++>8为假,$b++>7这个就不执行了
echo 'ok!';
}
echo 'a='.$a.'b='.$b; // a=11,b=7
细节:and && 都表示逻辑与 ,他们的区别在什么地方?
主要体现在优先级上面
and 的优先级
代码如下 复制代码
andor 如:
$a=false || true; //&& > = > and ;先比较false || true,再赋值
$b=false or true; //|| > = > or ;先赋值$b=false,再比较,所以结果是false
var_dump($a,$b); //bool(true) bool(false)
位运算符
位移在 php 中是数学运算。向任何方向移出去的位都被丢弃。左移时右侧以零填充,符号位被移走意味着正负号不被保留。右移时左侧以符号位填充,意味着正负号被保留。
要用括号确保想要的优先级。例如 $a & $b == true 先进行比较再进行按位与;而 ($a & $b) == true 则先进行按位与再进行比较。
要注意数据类型的转换。如果左右参数都是字符串,则位运算符将对字符的 ascii 值进行操作。
php 的 ini 设定 error_reporting 使用了按位的值,
提供了关闭某个位的真实例子。要显示除了提示级别
之外的所有错误,php.ini 中是这样用的:
e_all & ~e_notice
具体运作方式是先取得 e_all 的值:
00000000000000000111011111111111
再取得 e_notice 的值:
00000000000000000000000000001000
然后通过 ~ 将其取反:
11111111111111111111111111110111
最后再用按位与 and(&)得到两个值中都设定了(为 1)的位:
00000000000000000111011111110111
另外一个方法是用按位异或 xor(^)来取得只在
其中一个值中设定了的位:
e_all ^ e_notice
error_reporting 也可用来演示怎样置位。只显示错误和可恢复
错误的方法是:
e_error | e_recoverable_error
也就是将 e_error
00000000000000000000000000000001
和 e_recoverable_error
00000000000000000001000000000000
用按位或 or(|)运算符来取得在任何一个值中被置位的结果:
00000000000000000001000000000001
example #1 整数的 and,or 和 xor 位运算符
代码如下 复制代码
以上例程会输出:
--------- --------- -- ---------
result value op test
--------- --------- -- ---------
bitwise and
( 0 = 0000) = ( 0 = 0000) & ( 5 = 0101)
( 1 = 0001) = ( 1 = 0001) & ( 5 = 0101)
( 0 = 0000) = ( 2 = 0010) & ( 5 = 0101)
( 4 = 0100) = ( 4 = 0100) & ( 5 = 0101)
( 0 = 0000) = ( 8 = 1000) & ( 5 = 0101)
bitwise inclusive or
( 5 = 0101) = ( 0 = 0000) | ( 5 = 0101)
( 5 = 0101) = ( 1 = 0001) | ( 5 = 0101)
( 7 = 0111) = ( 2 = 0010) | ( 5 = 0101)
( 5 = 0101) = ( 4 = 0100) | ( 5 = 0101)
(13 = 1101) = ( 8 = 1000) | ( 5 = 0101)
bitwise exclusive or (xor)
( 5 = 0101) = ( 0 = 0000) ^ ( 5 = 0101)
( 4 = 0100) = ( 1 = 0001) ^ ( 5 = 0101)
( 7 = 0111) = ( 2 = 0010) ^ ( 5 = 0101)
( 1 = 0001) = ( 4 = 0100) ^ ( 5 = 0101)
(13 = 1101) = ( 8 = 1000) ^ ( 5 = 0101)
比较运算符
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。
代码如下 复制代码
true
var_dump(1 == 01); // 1 == 1 -> true
var_dump(10 == 1e1); // 10 == 10 -> true
var_dump(100 == 1e2); // 100 == 100 -> true
switch (a) {
case 0:
echo 0;
break;
case a: // never reached because a is already matched with 0
echo a;
break;
}
?>
对于多种类型,比较运算符根据下表比较(按顺序)。
比较多种类型 运算数 1 类型 运算数 2 类型 结果
null 或 string string 将 null 转换为 ,进行数字或词汇比较
bool 或 null 任何其它类型 转换为 bool,false true
object object 内置类可以定义自己的比较,不同类不能%
http://www.bkjia.com/phpjc/628810.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/628810.htmltecharticle算术运算符 1、算术运算符:+、-、*、/、%。 2、递增/递减运算符:如$a++,$a--,++$a,--$a. 如: 代码如下 复制代码 ?php $a=10; $b=5; $c=$a++; //先赋...