Почему Perl печатает значение, которого я не ожидаю после увеличения? - PullRequest
5 голосов
/ 06 августа 2011

Я запускаю этот однострочный текст из командной строки:

perl -MList::Util=sum -E 'my $x = 0; say sum(++$x, ++$x)'

Почему он говорит "4" вместо "3"?

Ответы [ 3 ]

7 голосов
/ 06 августа 2011

Во-первых, имейте в виду, что Perl проходит по ссылке.Это означает, что

sum(++$x, ++$x)

в основном совпадает с

do {
   local @_;
   alias $_[0] = ++$x;
   alias $_[1] = ++$x;
   ∑
}

Предварительное увеличение возвращает саму переменную, а не ее копию *, так что это означает и $_[0], и $_[1] имеют псевдоним $x.Поэтому sum видит текущее значение $x (2) для обоих аргументов.

Правило: не изменяйте и не читайте значение в одном выражении.

* - Это не задокументировано, но вы спрашиваете, почему Perl ведет себя так, как он.

4 голосов
/ 06 августа 2011

Вы изменяете $x дважды в одном выражении. Согласно документам , Perl не гарантирует, что будет результатом этих утверждений. Так что вполне может быть "2" или "0".

3 голосов
/ 06 августа 2011

Поскольку оба инкремента выполняются до вычисления суммы.

После выполнения обоих действий x = 2.

2 + 2 = 4.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...