|
递增递减运算符 前递增++++$a$a自增1,然后返回$a 后递增++$a++先返回$a,然后$a自增1 前递减----$a$a自减1,然后返回$a 后递减--$a--先返回$a,然后$a自减1 第一个注意事:不影响布尔值。递减NULL值也没有效果,但是递增NULL的结果是1。 换句话说:递增/递减运算中,不会把操作数转换成整数后再运算。如果运算数是布尔值,则直接返回结果。 递增/递减布尔值: $a = TRUE;
var_dump(++$a); // bool(true)
$a = TRUE;
var_dump(--$a); // bool(true)
$b = FALSE;
var_dump(++$b); // bool(false)
$b = FALSE;
var_dump(--$b); // bool(false) 递增/递减NULL: $a = NULL;
var_dump(++$a); // int(1)
$a = NULL;
var_dump(--$a); // NULL 在处理字符变量的算数运算时,PHP 沿袭了 Perl 的习惯,而非 C 的。 例如,在 Perl 中 $a = 'Z';
$a++; 将把$a变成'AA',而在 C 中, a = 'Z';
a++; 将把a变成'['('Z'的 ASCII 值是90,'['的 ASCII 值是91)。 注意字符变量只能递增,不能递减,并且只支持纯字母(a-z 和 A-Z)。 例如: $a="9D9";
var_dump(++$a); // string(3) "9E0" 但是,这里又有一个陷阱了: $a="9E0";
echo ++$a; // 10 安装上面的规则,应该输出9E1,但是这里却输出了10。为什么? 如果我们这么写,大部人就知道是为什么了。 $a = "9E0";
var_dump(++$a); // float(10) $a的类型是,也就是说,9E0是浮点数的科学记数法,即9 * 10^0 = 9,对9自增,结果当然是10了。 参考:转换为数值 现在问题又来了: $l = "Z99";
$l++; 这个结果是多少呢?结果按照 perl 语言的规则,是"AA00"。 还有一个: 递增/递减其他字符变量则无效,原字符串没有变化。 这个就不解释了。 最后一个注意事项: $a = '012';
$a++;
var_dump($a); 这个结果是'013'?13?11? 这段的结果是int(13),字符串'012'并没有被当作八进制。 $a = 012; // 八进制,十进制为 10
$b = "012"; // 转换为整数为十进制 12 如果是0x开头的呢? $a = '0x1A';
$a++;
var_dump($a); // int(27) 0开头的不被认为是八进制,但是0x开头的却被认为是十六进制。 在 PHP 官方文档中 Integer 整型 还有另一个八进制陷阱: var_dump(01090); // 八进制 010 = 十进制 8
手册中对此的解释为: Warning
如果向八进制数传递了一个非法数字(即 8 或 9),则后面其余数字会被忽略。 |