如果只在C中声明int [3],为什么2 [a]可以通过编译

时间:2011-04-21 01:56:55

标签: c arrays pointers gcc

如果仅在C中声明int [3],为什么可以编译2 [a]。

 1  #include <stdio.h>
 2
 3  int main(int argc, char **argv)
 4  {
 5      int a[3] = {1, 2, 3};
 6      printf("a[2] is: %d\n", a[2]);
 7      printf("2[a] is: %d\n", 2[a]);
 8
 9      return 0;
10  }

并且输出都是3,如何解释呢?

3 个答案:

答案 0 :(得分:12)

因为a[2]只是*(a+2)的语法糖,与*(2+a)2[a]相同。

答案 1 :(得分:3)

因为C中的所有a[2]表示*(a + 2),所以*(2 + a)也可以正常工作,也可以写成2[a]

答案 2 :(得分:2)

表达式由一个或多个操作数组成。表达式的最简单形式由单个文字常量或对象组成。通常,结果是操作数的右值。

根据C标准:

6.5.2.1数组下标

  

2后缀表达式后跟一个   方括号[]中的表达式是一个   下标的元素名称   一个数组对象。的定义   下标运算符[]就是这样   E1 [E2]与(*((E1)+(E2)))相同。   由于转换规则   如果是E1,则应用于二进制+运算符   是一个数组对象(相当于一个   指向一个初始元素的指针   数组对象)和E2是一个整数,   E1 [E2]表示E2的第E2个元素   E1(从零开始计算)。

因此,a[b]相当于*(a+b)b[a]。其中ab可以是任何表达。