3

どなたか次の説明をお願いします。

「プログラミング Perl」ブックでは、後置自動インクリメント演算子が次のように説明されています。

後に配置すると$a--$a++値を返した後に変数をインクリメントまたはデクリメントします。

したがって、私が理解して$a++いるように、無効なコンテキストで使用されることはありません。

変数をインクリメントまたはデクリメントします

しかし、次の例では、変数の値は決して変化しません:

my $a = 3;
$a = $a++;
say $a; #always outputs 3

したがって、値が同じ変数に割り当てられている場合にポスト自動インクリメントを使用する理由はないと思いますが、「プログラミング Perl」の定義は間違っていると見なす必要があります。演算子は変数に影響を与えませんが、変数の値 (少なくともその例では)。そうですか?

事前に感謝します。

4

2 に答える 2

16

なぜ、後置自動インクリメントと自動デクリメントの両方の演算子は、ではなく変数に影響を与えるため、実際には無効なコンテキストで非常に頻繁に使用されます。

古い値が割り当てられる前に変数がポストインクリメントされるため、あなたの例はそれが機能するように機能します。つまり、

my $a = 3; $a = $a++; 

...は...

1) $old_value = $a;
2) $a = $a + 1;
3) $a = $old_value;

あなたの例で置き換え$a = $a++て、後で $b と $a の値を出力すると、違いが$b = $a++はっきりとわかります。$a$b$a

于 2012-07-17T20:44:08.083 に答える
10

したがって、値が同じ変数に割り当てられている場合、ポストオートインクリメントを使用する理由はないと思いますが、「プログラミングPerl」からの定義は間違っていると見なす必要があります。原因演算子は変数に影響を与えませんが、変数の値に影響を与えます。そうですか?

これは本当に用語についてだと思います。

とがあり$a++ます++$a。それらは両方とも変数に影響します$a

my $a = 3;
$a++;
say $a;

あなたに与えます4が、そうします

my $a = 3;
++$a;
say $a;

違いは、彼らが返すものにあります。

$a++最初に古い値を返し、次にそれをインクリメントします。++$a最初に増分を実行してから、新しい値を返します。

my $a = 3;
say $a++;
say $a;

あなたにあげる:

3
4

その間:

my $a = 3;
say ++$a;
say $a;

プリント:

4
4

ただし、の戻り値を$a++変数に割り当てることはほとんどありません。最初に古い値を使用してから変数をインクリメントする別の操作で使用する可能性が非常に高くなります。

ここにいくつかの非常に不完全な例があります:

my $a = 3;
say $a while $a--;

プリント:

2
1
0

と:

my $a = 3;
say $a while --$a;

プリント:

2
1

何かの0または0番目のインデックスが必要な場合があります。そして時々あなたはそれを望まない。どちらも便利なimhoです。

于 2012-07-17T20:52:13.593 に答える