perl表达式中有任何副作用$ a = $ a ++;

use*_*860 3 perl auto-increment

将有人请解释下一个:

在"Programming Perl"一书中,postfix autoincrement operator被描述为

放置之后,它们($a--,$a++)在返回值后递增或递减变量.

因此,据我所知,$a++从未在虚空环境中使用,因为有人说过

他们增加或减少变量

但在下一个示例中,变量的值永远不会改变:

my $a = 3;
$a = $a++;
say $a; #always outputs 3
Run Code Online (Sandbox Code Playgroud)

所以我的假设是,当将值分配给同一个变量时,没有理由使用后自动递增,但是"编程Perl"中的定义应该被认为是错误的,因为运算符不会影响变量,而是变量中的值(至少在那个例子中).是对的吗?

提前欣赏.

rai*_*7ow 16

为什么,postfix自动增量和自动减量运算符实际上经常在void上下文中使用,因为它们影响变量 - 而不是.

您的示例以其工作方式工作,因为变量将旧值分配给它之前会后递增.换句话说,顺序

my $a = 3; $a = $a++; 
Run Code Online (Sandbox Code Playgroud)

...是... ...

1) $old_value = $a;
2) $a = $a + 1;
3) $a = $old_value;
Run Code Online (Sandbox Code Playgroud)

如果您更换$a = $a++$b = $a++在你的榜样,和$ b的值,打印和$一个之后,你就会清楚地看到的区别:虽然$a变(因此,等于4)增加,$b被分配的旧值$a(3).


sim*_*que 10

所以我的假设是,当将值赋给同一个变量时,没有理由使用后自动递增,但是"编程Perl"中的定义应该被认为是错误的,因为操作符不会影响变量,而是变量中的值.是对的吗?

我认为这是关于术语的.

$a++++$a.它们都会影响变量$a.

my $a = 3;
$a++;
say $a;
Run Code Online (Sandbox Code Playgroud)

给你4,但同样如此

my $a = 3;
++$a;
say $a;
Run Code Online (Sandbox Code Playgroud)

不同之处在于他们的回报.

$a++首先返回值,然后递增它.++$a首先进行增量,然后返回值.

my $a = 3;
say $a++;
say $a;
Run Code Online (Sandbox Code Playgroud)

给你:

3
4
Run Code Online (Sandbox Code Playgroud)

而:

my $a = 3;
say ++$a;
say $a;
Run Code Online (Sandbox Code Playgroud)

打印:

4
4
Run Code Online (Sandbox Code Playgroud)

但是你很难将返回值$a++赋给变量.您更有可能在另一个操作中使用它,在这个操作中,您首先要使用旧值,然后再增加变量.

以下是一些非常蹩脚的例子:

my $a = 3;
say $a while $a--;
Run Code Online (Sandbox Code Playgroud)

打印:

2
1
0
Run Code Online (Sandbox Code Playgroud)

和:

my $a = 3;
say $a while --$a;
Run Code Online (Sandbox Code Playgroud)

打印:

2
1
Run Code Online (Sandbox Code Playgroud)

有时候有些情况下你需要0或0的索引.有时候你不想要它.两者都是有用的imho.