是的,我知道,这对谷歌来说似乎很容易。我很清楚
x += y
和x = x + y
做同样的事情。这不是我的问题。
我的问题是这行代码到底在做什么(取自SplitMix64 PRNG代码):
uint64_t z = (x += 0x9e3779b97f4a7c15);
注意行中间的+=。 (要清楚,
x
也是一个uint64_t
。)
我认为这将做的是:
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
场景中使用+=)。
你在这里看到的并不是像
+=
这样的复合赋值运算符,而是一般的赋值运算符。对于any赋值运算符,整个表达式都有一个值,即被赋值的值。
赋值运算符在指定的对象中存储一个值 左操作数。赋值表达式的值为左边 赋值后的操作数,但不是左值。
所以你的评估是正确的。
有趣的是你今天问这个。最近有一个(现已删除)关于“计算整个人口被感染的天数”的问题。从一次感染开始,并考虑每一天新感染具有传染性一天。
公式结果为:
infected += newInfected = newInfected * Rvalue;
链接(从右到左工作)是 C 语法的许多强大方面之一。
在手边保留一份 C 的优先级表……有时会遗漏括号,从而导致出错。