pre-increment++++$a$aは1ずつインクリメントし、その後$aを返します
post-increment++$a++は最初に$aを返し、次に$aは1ずつインクリメントします
pre-decrement ---- $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 は C の習慣ではなく Perl の習慣に従います。
たとえば、Perl では
$a = 'Z'; $a++;
は $a を 'AA' に変換し、C では
a = 'Z'; a++;
は a を '[' に変換します ('Z' の ASCII 値は 90、' の ASCII 値は ' [' 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' は 8 進数として扱われません。
$a = 012; // 八进制,十进制为 10 $b = "012"; // 转换为整数为十进制 12
0x で始まる場合はどうなりますか?
$a = '0x1A'; $a++; var_dump($a); // int(27)
0 で始まるものは 8 進数とみなされませんが、0x で始まるものは 16 進数とみなされます。
在 PHP 官方文档中 Integer 整型 还有另一个八进制陷阱:
var_dump(01090); // 8 進数 010 = 10 進数 8
マニュアルでは次のように説明されています。
以上がPHP のインクリメント演算子とデクリメント演算子の理解と注意事項の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。