成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

php 的自增運(yùn)算符

pumpkin9 / 3250人閱讀

摘要:的一些小眾的用法,很多老司機(jī),使用時(shí)也會(huì)出問題。值值,自增后為整型數(shù)字運(yùn)算正常范圍的整數(shù)最大值的整數(shù)整數(shù)直接變成浮點(diǎn)數(shù)浮點(diǎn)數(shù)的計(jì)算若在精度范圍內(nèi),則自增加,若不在精度范圍內(nèi),則忽略。字符運(yùn)算繼承自的字符自增運(yùn)算符。

php 的一些小眾的用法,很多php老司機(jī),使用時(shí)也會(huì)出問題。
今天就聊一聊php的自增運(yùn)算符。

bool 值

對(duì)于bool值無效。

   # php -r "$a=false; $a++; var_dump($a);";
   bool(false)
null 值

null 值,自增后為整型1.

  # php -r "$a=null; $a++; var_dump($a);";
  int(1)
數(shù)字運(yùn)算

正常范圍的整數(shù):

#  php -r "$a=1; $a++; var_dump($a);";
int(2)

最大值的整數(shù),整數(shù)直接變成浮點(diǎn)數(shù):

  # php -r "$a=9223372036854775807; $a++; var_dump($a);"
  float(9.2233720368548E+18)
  # php -r "$a=9223372036854775806; $a++; var_dump($a);"
  int(9223372036854775807)

浮點(diǎn)數(shù)的計(jì)算:

若在精度范圍內(nèi),則自增加1,若不在精度范圍內(nèi),則忽略。

字符運(yùn)算 繼承自perl的字符自增運(yùn)算符。

以字符結(jié)尾

  # 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"

數(shù)字結(jié)尾

# php -r "$a="Z1"; $a++; var_dump($a);";
string(2) "Z2"
# php -r "$a="Z9"; $a++; var_dump($a);";
string(3) "AA0"

php 源碼中,字符串自增運(yùn)算符的算法說明:
#define LOWER_CASE 1
#define UPPER_CASE 2
#define NUMERIC 3

static void ZEND_FASTCALL increment_string(zval *str) /* {{{ */
{
  int carry=0;  // 標(biāo)識(shí)是否需要進(jìn)位
  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") { // 當(dāng)末端是z 時(shí),需要進(jìn)位,修改為a
              s[pos] = "a";
              carry=1;
          } else {
              s[pos]++;
              carry=0;
          }
          last=LOWER_CASE;
      } else if (ch >= "A" && ch <= "Z") {
          if (ch == "Z") { // 同理,當(dāng)末端是Z時(shí),需要進(jìn)位,修改為A
              s[pos] = "A";
              carry=1;
          } else {
              s[pos]++;
              carry=0;
          }
          last=UPPER_CASE;
      } else if (ch >= "0" && ch <= "9") {
          if (ch == "9") { // 當(dāng)末端時(shí)9時(shí),需要進(jìn)位
              s[pos] = "0";
              carry=1;
          } else {
              s[pos]++;
              carry=0;
          }
          last = NUMERIC;
      } else {           
          carry=0;
          break;
      }
      if (carry == 0) {   // 若已經(jīng)在當(dāng)前位處理完成,則結(jié)束,否則一直處理到第一位
          break;
      }
  } while (pos-- > 0);

  if (carry) {  // 需要進(jìn)位, 則需要多分配一個(gè)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] = "