请有人来解释下一个:
在“编程Perl”一书中,后缀自动增量算子被描述为
放置之后,他们(
$a--
,$a++
)在返回值后递增或递减变量。
所以,正如我所理解的那样,$a++
从未在void上下文中使用过,因为有人说过
他们增加或减少变量
但是在下一个示例中,变量的值永远不会改变:
my $a = 3;
$a = $a++;
say $a; #always outputs 3
所以我的假设是,当将值赋给同一个变量时没有理由使用后自动递增,但是“编程Perl”中的定义应该被认为是错误的,因为运算符不会影响变量,而是值在变量中(至少在该示例中)。是吗?
提前欣赏。
答案 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索引。有时候你不想要它。两者都很有用。