在 php 的官方手冊中寫道:
php 支援 c 風格的前/後遞增與遞減運算子。第乙個注意事:遞增/遞減運算子不影響布林值。遞減
null
值也沒有效果,但是遞增null
的結果是1
。
換句話說:遞增/遞減運算中,不會把運算元轉換成整數後再運算。如果運算數是布林值,則直接返回結果。
遞增/遞減布林值:
遞增/遞減php
$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
:
在處理字元變數的算數運算時,php 沿襲了 perl 的習慣,而非 c 的。php
$a = null;
var_dump(++$a); // int(1)
$a = null;
var_dump(--$a); // null
例如,在 perl 中
將把perl
$a = 'z';
$a++;
$a
變成'aa'
,而在 c 中,
將把c
a = 'z';
a++;
a
變成'['
('z'
的 ascii 值是90
,'['
的 ascii 值是91
)。
注意字元變數只能遞增,不能遞減,並且只支援純字母(a-z 和 a-z)。
例如:
但是,這裡又有乙個陷阱了:php
$a="9d9";
var_dump(++$a); // string(3) "9e0"
安裝上面的規則,應該輸出php
$a="9e0";
echo ++$a; // 10
9e1
,但是這裡卻輸出了10
。wtf?
如果我們這麼寫,大部人就知道是為什麼了。
php
$a = "9e0";
var_dump(++$a); // float(10)
$a
的型別是浮點型,也就是說,9e0
是浮點數的科學記數法,即9 * 10^0 = 9
,對9
自增,結果當然是10
了。
現在問題又來了:
這個結果是多少呢?結果按照 perl 語言的規則,是php
$l = "z99";
$l++;
"aa00"
。
還有乙個注意事項:
遞增/遞減其他字元變數則無效,原字串沒有變化。
這個就不解釋了。
最後乙個注意事項:
這個結果是php
$a = '012';
$a++;
var_dump($a);
'013'
?13
?11
?
這段的結果是int(13)
,字串'012'
並沒有被當作八進位制。
如果是php
$a = 012; // 八進位制,十進位制為 10
$b = "012"; // 轉換為整數為十進位制 12
0x
開頭的呢?
wtf!居然不按套路出牌。php
$a = '0x1a';
$a++;
var_dump($a); // int(27)
0
開頭的不被認為是八進位制,但是0x
開頭的卻被認為是十六進製制。
在 php 官方文件中 integer 整型 還有另乙個八進位制陷阱:
手冊中對此的解釋為:php
var_dump(01090); // 八進位制 010 = 十進位制 8
warning綜上,php 不愧是世界上「最好」的語言。如果向八進位制數傳遞了乙個非法數字(即 8 或 9),則後面其餘數字會被忽略。
沒有之一。
PHP 中 自增 自減 運算引發的奇怪問題
a true var dump a bool true b false var dump b bool false b false var dump b bool false 遞增 遞減 null php a null var dump a int 1 a null var dump a null在...
PHP 中 自增 自減 運算引發的奇怪問題
在 php 的官方手冊中寫道 php 支援 c 風格的前 後遞增與遞減運算子。第乙個注意事 遞增 遞減運算子不影響布林值。遞減 null 值也沒有效果,但是遞增 null 的結果是 1。換句話說 遞增 遞減運算中,不會把運算元轉換成整數後再運算。如果運算數是布林值,則直接返回結果。遞增 遞減布林值 ...
PHP自增自減
寫出一下php段的輸出結果 count 5 function get count echo count count echo get count echo get count 答案為 501 主要涉及到兩個知識點 1.php變數的作用域 2.自增 自減變數 面試人對 php變數的作用域 理解挺到位,...