Сложные операторы присваивания, что произойдет, если значение будет изменено (в это время)?
Рассмотрим следующий псевдокод (независимый от языка):
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