次のコードは、予想とは異なる出力を示しています。「i」は ans である必要があります。
コード:
$var = 'i';
$var++;
print $var;
$var--;
print " * ",$var;
結果:
j ***** -1
誰でも動作を説明できますか? 私は非常にばかげたことを見逃していることを知っています。
ありがとう
次のコードは、予想とは異なる出力を示しています。「i」は ans である必要があります。
コード:
$var = 'i';
$var++;
print $var;
$var--;
print " * ",$var;
結果:
j ***** -1
誰でも動作を説明できますか? 私は非常にばかげたことを見逃していることを知っています。
ありがとう
自動インクリメント演算子++
は、数値以外の文字列もインクリメントできるという点で「魔法」です。とi
なりj
ます。自動減分演算子--
には、この「魔法の」機能がありません。したがって、文字列j
は になる数値に変換され0
、次に に減分され-1
ます。
これはperldoc perlopに文書化されています:
自動インクリメント演算子には、少し余分なビルトイン マジックがあります。数値変数、または数値コンテキストで使用されたことのある変数をインクリメントすると、通常のインクリメントが得られます。ただし、変数が設定されてから文字列コンテキストでのみ使用され、空の文字列ではなく、パターン /^[a-zA-Z] [0-9] \z/ に一致する値を持つ場合、インクリメントは文字列として行われ、各文字をその範囲内に保持し、キャリーを使用します。
print ++($foo = "99"); # prints "100" print ++($foo = "a0"); # prints "a1" print ++($foo = "Az"); # prints "Ba" print ++($foo = "zz"); # prints "aaa"
undef は常に数値として扱われ、特にインクリメントする前に 0 に変更されます (そのため、undef 値のポストインクリメントは undef ではなく 0 を返します)。
自動デクリメント演算子は魔法ではありません。
perl には char 型はありません。「i」は「i」と同じ文字列です。問題は、なぜ ++ が char の値を増加させるのかということです。この質問はここで議論されています: Perl のインクリメント (++) およびデクリメント (--) 文字列