C 中 += 和类似运算符的操作背后的细节是什么?

Arr*_*lt3 2 c operators

是的,我知道,这对于谷歌来说似乎是理所当然的。我很清楚这与x += y做同样的事情x = x + y。这不是我的问题。

我的问题是这行代码到底在做什么(取自SplitMix64 PRNG代码):

uint64_t z = (x += 0x9e3779b97f4a7c15);
Run Code Online (Sandbox Code Playgroud)

注意该行中间的+=。(要明确的是,x也是一个uint64_t。)

认为这会做的是:

  • 添加 0x9e3779b97f4a7c15x并产生结果。
  • 将该结果分配给x.
  • 此外,将相同的结果分配给z

快速测试让我觉得我可能是对的:

#include <stdio.h>

int main() {
  int x;
  int y;
  x = 5;
  y = (x += 6); 
  printf("%d\n", x); 
  printf("%d\n", y); 
}
Run Code Online (Sandbox Code Playgroud)

这在我的系统上打印“11”两次(用简单的编译gcc test.c)。

可以肯定的是,我想确认这就是事情的工作原理(并且还查明在使用 += 及其同级时是否会遇到其他奇特的极端情况)。我在搜索尝试中找不到有关此内容的信息(所有内容似乎都假设您在简单的x += y场景中使用 += )。

dbu*_*ush 5

您在这里看到的并不是特定于复合赋值运算符+=,而是一般的赋值运算符。对于任何赋值运算符,整个表达式都有一个值,即被赋值的值。

C 标准第 6.5.16p3 节对此进行了详细说明:

赋值运算符将值存储在左操作数指定的对象中。赋值表达式具有赋值后左操作数的值,但不是左值。

所以你的评价是正确的。