+=和=+ C赋值运算符有啥区别[重复]

Posted

技术标签:

【中文标题】+=和=+ C赋值运算符有啥区别[重复]【英文标题】:What is the difference between += and =+ C assignment operators [duplicate]+=和=+ C赋值运算符有什么区别[重复] 【发布时间】:2017-05-27 18:07:21 【问题描述】:

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

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

+= 添加右值到左值

x += y;
x = x + y;

=+ 右值分配给左值

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

【问题讨论】:

C 中没有=+ 运算符。 @EugeneSh。是的,但它有效。所以我不应该使用它吗?它只是偶然在我的电脑上起作用? 我是两个不同的操作员。赋值和一元+ @EugeneSh.:严格来说,C 中不再有 =+ 运算符。它在 70 年代中期不再是 C 的一部分。请注意,=+=-=& 都可以出现在现代 C 语言中——甚至 =* 如果后面的术语是一个指针。其他大部分都做不到。但是,含义是两个独立的运算符;他们接触的事实无关紧要。 如果您有:int main(void) int i = 2, j = 3; i =+ j; printf("%d\n", i); return 0; ,您打印的是 3 还是 5?标准 C 说它应该是 3。即使我从未使用过产生不同结果的编译器——从最初的 =++= 的变化发生在我开始用 C 编码之前的几年。 【参考方案1】:

在现代 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),它会警告 =- 的模糊使用,但会使用旧的含义。除非您是玩一些非常旧软件和/或硬件的爱好者,否则现在这应该不是问题。

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

【讨论】:

直到今天我仍然在= 之后放置一个空格,所以a = -7; 不会被误解为a -= 7; @chux-ReinstateMonica 我也是,但只是因为我觉得它更清晰。

以上是关于+=和=+ C赋值运算符有啥区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的一个等号和两个等号有啥区别

int c=8;和int? c=8;有啥区别,作用是?

C程序定义一指针变量,直接令它赋值为NULL,不对它用malloc申请内存可以么?赋值和申请内存到底有啥区别

C语言中的.c和.cpp有啥区别?

C语言里符号常量和常变量有啥区别?

C++set容器-构造和赋值