3

有人请解释下一个:

在“Programming Perl”一书中描述了后缀自动增量运算符,如

放在后面时,它们 ( $a--, $a++) 在返回值后递增或递减变量。

所以,据我所知,$a++永远不会在无效的上下文中使用,因为有人说过

他们增加或减少变量

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

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

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

提前欣赏。

4

2 回答 2

16

为什么,后缀 autoincrement 和 autodecrement 运算符实际上都经常在 void 上下文中使用,因为它们影响变量- 而不是value

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

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),但被分配了(3)$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 个索引。有时你不想要它。两者都是有用的恕我直言。

于 2012-07-17T20:52:13.593 回答