8

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

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

+= 右值添加到左值

x += y;
x = x + y;

=+ 右值分配给左值

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

1 回答 1

16

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

所以如果你写:

x += y;

相当于

x = x + y;

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

如果你写:

x =+ y;

然后它被解析为

x = + y;

而 the+是一元加运算符。

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

(1975 年的C 参考手册显示了复合赋值运算符的旧=-, =+, et al 形式。Kernighan 和 Ritchie 于​​ 1978 年出版的第一版The C Programming Language显示了现代的-=, +=, et al,但提到了旧形式在“时代错误”下。)

于 2017-01-12T21:22:18.443 回答