C语言中+=和类似运算符背后的所有细节是什么?

问题描述 投票:0回答:2

是的,我知道,这对谷歌来说似乎很容易。我很清楚

x += y
x = x + y
做同样的事情。这不是我的问题。

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

uint64_t z = (x += 0x9e3779b97f4a7c15);

注意行中间的+=。 (要清楚,

x
也是一个
uint64_t
。)

认为这将做的是:

  • 将0x9e3779b97f4a7c15添加到
    x
    并产生结果。
  • 将结果分配给
    x
    .
  • 进一步将相同的结果分配给
    z

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

#include <stdio.h>

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

这会在我的系统上打印两次“11”(使用简单的

gcc test.c
编译)。

可以肯定的是,我想确认这就是事情的工作原理(并找出在使用 += 及其兄弟时是否有任何其他奇特的极端情况)。我在搜索尝试中找不到关于此的信息(关于它的一切似乎都假设你在简单的

x += y
场景中使用+=)。

c operators
2个回答
2
投票

你在这里看到的并不是像

+=
这样的复合赋值运算符,而是一般的赋值运算符。对于any赋值运算符,整个表达式都有一个值,即被赋值的值。

这在 C 标准的第 6.5.16p3 节中有详细说明

赋值运算符在指定的对象中存储一个值 左操作数。赋值表达式的值为左边 赋值后的操作数,但不是左值。

所以你的评估是正确的。


1
投票

有趣的是你今天问这个。最近有一个(现已删除)关于“计算整个人口被感染的天数”的问题。从一次感染开始,并考虑每一天新感染具有传染性一天。

公式结果为:

infected += newInfected = newInfected * Rvalue;

链接(从右到左工作)是 C 语法的许多强大方面之一。

在手边保留一份 C 的优先级表……有时会遗漏括号,从而导致出错。

© www.soinside.com 2019 - 2024. All rights reserved.