+= 和 =+ C 赋值运算符有什么区别

What is the difference between += and =+ C assignment operators

我想知道 =++=(以及其他赋值运算符)之间是否存在差异。我试过了,两者都做了同样的事情。那么有区别还是有约定?两者都有效是因为我的编译器不检查标准吗?

编辑:我弄错了。我在测试期间使用了错误的输入,这让我认为他们都在做同样的事情。原来它们是两个不同的东西。

+= 右值添加到左值

x += y;
x = x + y;

=+ 右值分配给左值

x =+ y;
x = +y;
x = y;

在现代 C 中,甚至是相当古老的 C 中,+= 是一个复合赋值运算符,而 =+ 被解析为两个单独的标记。 =+。标点符号允许相邻。

所以如果你写:

x += y;

相当于

x = x + y;

除了 x 只计算一次(如果它是一个更复杂的表达式,这可能很重要)。

如果你写:

x =+ y;

然后它被解析为

x = + y;

并且 + 是一元加运算符。

非常 C 的早期版本(大约在 1970 年代中期,在 1978 年 K&R1 出版之前)使用不同的符号进行复合赋值。现代 C 使用 +=,早期 C 使用 =+。早期的 C 没有一元 + 运算符,但它有一个一元 - 运算符,并且 =- 的使用引起了问题;程序员会写 x=-y,意图表示 x = -y,但它被默默地解释为 x =- y。语言在 1975 年和 1978 年之间的某个时间发生了变化,以避免出现该问题。直到 1999 年,我还在使用一个编译器(VMS 上的 VAXC),它会警告 =- 的使用不明确,但会使用旧的含义。现在这不应该是一个问题,除非你是一个玩一些非常旧软件and/or硬件的爱好者。

(A 1975 C Reference Manual 显示了旧的 =-=+ 等复合赋值运算符的形式。The C Programming Language 第一版 由 Kernighan 和 Ritchie 于​​ 1978 年出版,展示了现代 -=+= 等,但在 "Anachronisms" 下提到了旧形式。)