复合赋值运算符,如果修改了值(同时)会发生什么?

时间:2013-06-08 20:06:31

标签: language-agnostic programming-languages operators pseudocode compound-assignment

考虑以下伪代码(语言不可知):

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

   return 2;
}

int v = 1;

v += f(v);

当功能f在评估y时更改vv += 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 个答案:

答案 0 :(得分:3)

在大多数语言中+=运算符(以及任何其他复合赋值运算符,以及简单赋值运算符)具有从右到左的关联性。这意味着将首先评估f(v)值,然后然后将其结果添加到v当前值。

所以在你的例子中它应该是4而不是3:

C ++:demo

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

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

Perl:demo

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

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

print $v; # 4