PHP 中 自增 自減 運算引發的奇怪問題

2021-09-23 16:43:53 字數 2251 閱讀 4310

在 php 的官方手冊中寫道:

php 支援 c 風格的前/後遞增與遞減運算子。

第乙個注意事:遞增/遞減運算子不影響布林值。遞減 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。wtf?

如果我們這麼寫,大部人就知道是為什麼了。

$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)

wtf!居然不按套路出牌。0 開頭的不被認為是八進位制,但是 0x 開頭的卻被認為是十六進製制。

在 php 官方文件中 integer 整型 還有另乙個八進位制陷阱:

var_dump

(01090

);// 八進位制 010 = 十進位制 8

手冊中對此的解釋為:

warning

如果向八進位制數傳遞了乙個非法數字(即 8 或 9),則後面其餘數字會被忽略。

綜上,php 不愧是世界上「最好」的語言。

沒有之一。

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 a...

PHP自增自減

寫出一下php段的輸出結果 count 5 function get count echo count count echo get count echo get count 答案為 501 主要涉及到兩個知識點 1.php變數的作用域 2.自增 自減變數 面試人對 php變數的作用域 理解挺到位,...