摘要:的一些小眾的用法,很多老司機,使用時也會出問題。值值,自增后為整型數字運算正常范圍的整數最大值的整數整數直接變成浮點數浮點數的計算若在精度范圍內,則自增加,若不在精度范圍內,則忽略。字符運算繼承自的字符自增運算符。
php 的一些小眾的用法,很多php老司機,使用時也會出問題。
今天就聊一聊php的自增運算符。
對于bool值無效。
# php -r "$a=false; $a++; var_dump($a);"; bool(false)null 值
null 值,自增后為整型1.
# php -r "$a=null; $a++; var_dump($a);"; int(1)數字運算
正常范圍的整數:
# php -r "$a=1; $a++; var_dump($a);"; int(2)
最大值的整數,整數直接變成浮點數:
# php -r "$a=9223372036854775807; $a++; var_dump($a);" float(9.2233720368548E+18) # php -r "$a=9223372036854775806; $a++; var_dump($a);" int(9223372036854775807)
浮點數的計算:
若在精度范圍內,則自增加1,若不在精度范圍內,則忽略。
字符運算 繼承自perl的字符自增運算符。
以字符結尾
# php -r "$a="a"; $a++; var_dump($a);"; string(1) "b" # php -r "$a="z"; $a++; var_dump($a);"; string(2) "aa" # php -r "$a="A"; $a++; var_dump($a);"; string(1) "B" # php -r "$a="Z"; $a++; var_dump($a);"; string(2) "AA" # php -r "$a="zzz"; $a++; var_dump($a);"; string(4) "aaaa"
數字結尾
# php -r "$a="Z1"; $a++; var_dump($a);"; string(2) "Z2" # php -r "$a="Z9"; $a++; var_dump($a);"; string(3) "AA0"php 源碼中,字符串自增運算符的算法說明:
#define LOWER_CASE 1 #define UPPER_CASE 2 #define NUMERIC 3 static void ZEND_FASTCALL increment_string(zval *str) /* {{{ */ { int carry=0; // 標識是否需要進位 size_t pos=Z_STRLEN_P(str)-1; // 從字符串末端開始遍歷 char *s; zend_string *t; int last=0; /* Shut up the compiler warning */ int ch; if (Z_STRLEN_P(str) == 0) { zval_ptr_dtor_str(str); ZVAL_INTERNED_STR(str, ZSTR_CHAR("1")); return; } if (!Z_REFCOUNTED_P(str)) { Z_STR_P(str) = zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0); Z_TYPE_INFO_P(str) = IS_STRING_EX; } else if (Z_REFCOUNT_P(str) > 1) { Z_DELREF_P(str); Z_STR_P(str) = zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0); } else { zend_string_forget_hash_val(Z_STR_P(str)); } s = Z_STRVAL_P(str); do { ch = s[pos]; if (ch >= "a" && ch <= "z") { if (ch == "z") { // 當末端是z 時,需要進位,修改為a s[pos] = "a"; carry=1; } else { s[pos]++; carry=0; } last=LOWER_CASE; } else if (ch >= "A" && ch <= "Z") { if (ch == "Z") { // 同理,當末端是Z時,需要進位,修改為A s[pos] = "A"; carry=1; } else { s[pos]++; carry=0; } last=UPPER_CASE; } else if (ch >= "0" && ch <= "9") { if (ch == "9") { // 當末端時9時,需要進位 s[pos] = "0"; carry=1; } else { s[pos]++; carry=0; } last = NUMERIC; } else { carry=0; break; } if (carry == 0) { // 若已經在當前位處理完成,則結束,否則一直處理到第一位 break; } } while (pos-- > 0); if (carry) { // 需要進位, 則需要多分配一個byte t = zend_string_alloc(Z_STRLEN_P(str)+1, 0); memcpy(ZSTR_VAL(t) + 1, Z_STRVAL_P(str), Z_STRLEN_P(str)); ZSTR_VAL(t)[Z_STRLEN_P(str) + 1] = "