=+
我想知道和+=
(以及其他赋值运算符)之间是否有区别。我试过了,两者都做了同样的事情。那么有区别还是有约定?两者都有效,因为我的编译器不检查标准吗?
编辑:我犯了一个错误。我在测试期间使用了错误的输入,这让我认为他们都在做同样的事情。原来它们是两种不同的东西。
+=
将右值添加到左值
x += y;
x = x + y;
=+
将右值分配给左值
x =+ y;
x = +y;
x = y;
=+
我想知道和+=
(以及其他赋值运算符)之间是否有区别。我试过了,两者都做了同样的事情。那么有区别还是有约定?两者都有效,因为我的编译器不检查标准吗?
编辑:我犯了一个错误。我在测试期间使用了错误的输入,这让我认为他们都在做同样的事情。原来它们是两种不同的东西。
+=
将右值添加到左值
x += y;
x = x + y;
=+
将右值分配给左值
x =+ y;
x = +y;
x = y;
在现代 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,但提到了旧形式在“时代错误”下。)