5

考虑以下伪代码(与语言无关):

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
4

1 回答 1

3

在大多数语言中+=,运算符(以及任何其他复合赋值运算符,以及简单赋值运算符)具有从右到左的结合性。这意味着f(v)将首先评估 value,然后将其结果添加到 的当前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
于 2013-06-08T20:13:47.620 回答