如果仅在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,如何解释呢?
答案 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]
。其中a
和b
可以是任何表达。