Сложные операторы присваивания, что произойдет, если значение будет изменено (в это время)?

Рассмотрим следующий псевдокод (независимый от языка):

int f(reference int y) {
   y++;

   return 2;
}

int v = 1;

v += f(v);

Когда функция f изменения y (то есть v) при оценке v += f(v)является исходной величиной v "заморожен" и меняется на v "потерял"?

v += f(v); // Compute the address of v (l-value)
           // Evaluate v (1)
           // Execute f(v), which returns 2
           // Store 1 + 2 
printf(v); // 3

1 ответ

Решение

На большинстве языков += Оператор (как и любой другой составной оператор присваивания, а также простой оператор присваивания) имеет ассоциативность справа налево. Это означает f(v) значение будет оцениваться в первую очередь, затем его результат будет добавлен к текущему значению v,

Так что в вашем примере это должно быть 4, а не 3:

C++: ( демо)

int f(int& v) {
  v++;
  return 2;
}

int main() {
  int v = 1;
  v += f(v);
  cout << v; // 4
}

Perl: ( демо)

sub f {
  $_[0]++;
  return 2;
}

my $v = 1;
$v += f($v);

print $v; # 4