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

时间:2012-07-17 20:36:34

标签: perl auto-increment

请有人来解释下一个:

在“编程Perl”一书中,后缀自动增量算子被描述为

  

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

所以,正如我所理解的那样,$a++从未在void上下文中使用过,因为有人说过

  

他们增加或减少变量

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

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

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

提前欣赏。

2 个答案:

答案 0 :(得分:16)

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

您的示例以其工作方式工作,因为变量在之前获得后递增,其旧值被分配给它。换句话说,

的顺序
my $a = 3; $a = $a++; 

......是......

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

如果您在示例中将$a = $a++替换为$b = $a++,并在之后打印$ b和$ a的值,您将清楚地看到差异:$a变为递增(因此,等于4),$b被赋予旧值$a(3)。

答案 1 :(得分:10)

  

所以我的假设是没有理由使用后自动增量   当值被赋给同一个变量时,然后是定义   从“编程Perl”应该被认为是错误的,导致运算符   不会影响变量,但会影响变量中的值。是吗?

我认为这是关于术语的。

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

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

为您提供4,但

也是如此
my $a = 3;
++$a;
say $a;

不同之处在于他们的回归。

$a++首先返回值,然后递增它。 ++$a首先执行增量,然后返回 new 值。

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索引。有时候你不想要它。两者都很有用。