“+=”和“=+”C语言赋值运算符有什么区别?

9
我在想“=+”和“+=”(以及其他赋值运算符)是否有区别。我尝试了一下,两者看起来都没什么区别。那么它们是有区别还是遵循一定的规范?这两种方式都能用是否因为我的编译器不检查标准?
编辑:我犯了一个错误,在测试时使用了错误的输入,导致我认为这两个操作都是相同的。结果发现它们是不同的。
“+=”将右值加到左值上。
x += y;
x = x + y;

=+ 赋值 将 rvalue 赋给 lvalue

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

16
在C语言中没有=+运算符。 - Eugene Sh.
6
我作为两个不同的操作符工作。分配和一元 + - Eugene Sh.
9
严格来说,在C语言中已经没有=+运算符了。它在70年代中期就不再是C语言的一部分了。需要注意的是,现代C语言中既可以出现=+=-=&,甚至如果其后面的术语是一个指针,则可以出现=*。但大多数其他运算符都不能这样做。然而,它们是两个单独运算符的含义,它们是否相邻并不重要。 - Jonathan Leffler
2
如果你有以下代码:int main(void) { int i = 2, j = 3; i =+ j; printf("%d\n", i); return 0; },你会得到打印出来的是3还是5?标准C规定应该是3。即使我从未使用过编译器给出不同结果的情况——从原始的=+更改为+=已经发生多年了,早在我开始使用C语言编程之前。 - Jonathan Leffler
1
@SunggukLim:这并不奇怪。=+是两个运算符,即等号(=)和加号(+)。请参阅我的答案以获取详细信息。 - Keith Thompson
显示剩余6条评论
1个回答

20
在现代 C 语言中,即使在较古老的版本中,+= 是一个复合赋值运算符,而 =+ 则被分解为两个独立的标记,即 =+。标点符号可以相邻出现。
因此,如果您写成:
x += y;

它等同于

x = x + y;

除了x仅被评估一次(如果它是一个更复杂的表达式可能很重要)之外,其他都相同。

如果您写:

x =+ y;

然后它被解析为

x = + y;

+ 是一元正运算符。

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

(1975年的C参考手册显示了旧的=-=+等复合赋值运算符形式。Kernighan和Ritchie出版于1978年的第一版C程序设计语言显示了现代-=+=等形式,但在“过时用法”中提到了旧形式。)


2
直到今天,我仍在 = 后面加一个空格,这样 a = -7; 就不会被误解为 a -= 7; - chux - Reinstate Monica
1
@chux-ReinstateMonica 我也是,但只是因为我觉得它更易读。 - Keith Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接