为什么以下阵列操作非法?

时间:2017-05-17 08:53:23

标签: c arrays

表达式x++;x*2;报告为非法。编译器生成错误。但是,如果x+1;没有报告错误。

任何人都可以帮助我理解为什么特定表达是非法的吗?或者,换句话说,为什么增加是合法的?

代码:

#include <stdio.h>
int main(void)
{ 
   int x[]={1,2,3,4,5};
   x++;
   x+1; 
   x*2;
}    

3 个答案:

答案 0 :(得分:4)

实际上,您需要了解允许运营商的方式和时间。让我们一个接一个地看。

引自C11

  • ++,后缀增量,章节§6.5.2.3

      

    后缀增量或减量运算符的操作数应具有原子的,合格的,   或不合格的真实或指针类型,并且应该是可修改的左值。

  • +,添加剂运算符,章节§6.5.6

      

    另外,两个操作数都应具有算术类型,或者一个操作数应为a   指向完整对象类型的指针,另一个指针应具有整数类型。 (递增是   相当于添加1。)

  • *,乘法运算符,章节§6.5.5

      

    每个操作数都应具有算术类型。 [...]

现在,在您的使用中

  • x++; - &gt; x不是可修改的左值,它是“数组类型”。这会导致错误。
  • x+1; - &gt;满足要求请参阅数组衰减的注释,因此有效。
  • x*2; - &GT; x不是算术类型(它的指针类型),因此无效。

补充说明:(所有强调我的)

  • “可修改的左值:”

    引用章节§6.3.2.1,

      

    lvalue是一个潜在的表达式(对象类型不是void)   指定一个对象; [...] 可修改的左值是左值   没有数组类型,没有不完整的类型,没有const限定   类型,如果是结构或联合,则没有任何成员(包括,   递归地,所有包含聚合或联合的成员或元素具有const限定   类型。

  • “算术类型:”

    引用§6.2.5,

      

    整数和浮点类型统称为算术类型。 [...]

  • “数组衰减:”

    引用§6.3.2.1,

      

    除非它是sizeof运算符,_Alignof运算符或者&运算符的操作数。   一元template <int Row, int Col> void some_func(bool my_array[Row][Col]) { //do your stuff //here just printing the array and changing a value for (int i = 0; i < Row; i++) { for (int j = 0; j < Col; j++) std::cout << my_array[i][j]; std::cout << std::endl; } my_array[3][4] = false; } 运算符,或者是用于初始化数组的字符串文字,一个表达式   type ''类型''的数组被转换为类型''指向类型''指针的表达式   到数组对象的初始元素,而不是左值。 [...]

答案 1 :(得分:4)

在这三个陈述中

x++;
x+1; 
x*2;
只有两种说法是非法的。这句话

x+1; 

是对的。在这种情况下,在表达式中,数组指示符将转换为指向其第一个元素的指针。

没有为指针定义乘法运算符。所以这句话

x*2;

是非法的。

数组是不可修改的左值。您可能无法更改阵列指示符。所以这句话

x++;

是非法的。

答案 2 :(得分:0)

此处,x数组,您无法修改数组的地址。这在C中是违法的。

GCC 编译器出错:

 In function 'main':
5:5: error: lvalue required as increment operand
    x++;
     ^
7:5: error: invalid operands to binary * (have 'int *' and 'int')
    x*2;