在C中,为什么数组引用a + = 2; 无效的代码

Rya*_*ach 3 c arrays

从我的演讲幻灯片中,它指出:

如下面的代码所示,可以将数组名称分配
给适当的指针,而无需前面的&运算符.

int x;  
int a[3] = {0,1,2};  
int *pa = a;  
x = *pa;  
x = *(pa + 1);  
x = *(pa + 2);  
a += 2; /* invalid */  
Run Code Online (Sandbox Code Playgroud)

为什么a += 2;无效?

谁能帮忙澄清一下?
如果你想到一个更好的标题,也可以自由编辑标题.

Sve*_*ven 8

a += 2被翻译成a = a + 2.向数组添加数字与向有效指针添加数字并生成新指针的数字相同.

赋值是问题 - 数组不是左值,因此您无法为它们分配任何内容.这是不允许的.即使你可以在这里存在类型不匹配 - 你正试图分配一个指向一个没有意义的数组的指针.

  • @Sven:实际上它是一个左值,但是你无法分配.6.3.2.1/1,"可修改的左值是一个左值,它没有数组类型,没有不完整的类型,没有常量类型,如果是结构或联合,则没有任何成员(包括,递归地,所有包含的聚合或联合的任何成员或元素)具有const-quali fi ed类型".可以说,术语"左值"因此具有误导性的术语,因为有左值不能作为赋值的lhs.C++ 0x通过引入几种新的表达式来"澄清"这个问题;-) (3认同)

Pra*_*rav 7

a += 2;无效,因为+=没有为数组定义运算符.此外,数组是不可修改的,lvalues因此您无法分配它们.