我有以下代码:

#include <stdio.h>
int main(int argc, char **argv) {
    int i = 0;
    (i+=10)+=10;
    printf("i = %d\n", i);
    return 0;
}

如果我试图使用gcc将其编译为C源代码,我会得到一个错误:

error: lvalue required as left operand of assignment

但是,如果我使用g++将其编译为C++源代码,则在运行可执行文件时不会出现错误:

i = 20

为什么会有不同的行为?

推荐答案

复合赋值运算符在C和C++中的语义不同:

C99标准6.5.16第3部分:

赋值运算符将值存储在由左操作数指定的对象中.一

在C++5.17.1中:

赋值运算符(=)和复合赋值运算符都从右向左分组.所有这些都需要一个可修改的

EDIT : C++中(i+=10)+=10的行为在C++98中没有定义,但在C++11中定义得很好.有关标准的相关部分,请参阅this answerNPE之间的问题.

C++相关问答推荐

是否可以在C中进行D3 D12申请?

如何用C(使用两个s补数算术的32位程序)计算

修改pGM使用指针填充2-D数组但不起作用

是否定义了数组指针类型转换为指针类型?""""

以c格式打印时间戳

C++中矢量类型定义和数据保护的高效解决方案

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

C中的FREE函数正在触发断点

从C文件中删除注释

指向不同类型的指针是否与公共初始序列规则匹配?

Caesar密码调试:输出文本末尾的问号和随机字符

有没有一种方法可以用C创建保留限定符的函数?

当用C打印过多的';\n';时输出不正确

RISC-V GCC编译器错误编译ASM代码

解密Chrome加密密钥

按字典顺序打印具有给定字符的所有可能字符串

在C中打印指针本身

我正在使用 klib 库 我可以使用 (khash) KHASH_SET_INIT_INT64() 负值作为键.因为我在头文件中看到它使用 unsigned long int

无法理解 fgets 输出

将数组中的所有元素初始化为 struct 中的相同值