最近看到了以下代码:
int main()
{
int a = 3;
0[&a] = a+a;//What is this???
}
有人可以解释,这意味着什么?
答案 0 :(得分:7)
这是一些丑陋的代码 - 但它完全合法(在C和C ++中)。
正如this question(this popular answer和my attempt to provide some historical context中所解释的那样。[]
索引运算符是可交换的,所以
0[&a] = a+a;
相当于:
(&a)[0] = a+a;
&a
是int
对象a
的地址。索引运算符采用指针操作数和整数操作数。通常,指针是数组名称(或者等效地,在此上下文中,指向数组的第一个元素的指针)。但是,出于索引和指针算术的目的,单个对象可以被视为具有单个元素的数组。
之前的声明是:
int a = 3;
该作业将int
对象a
视为int
的单元素数组,并引用该数组的元素0
- 恰好是唯一存在的元素。
a
的先前值为3,因此a+a
显然是6。
所以这个:
int a = 3;
0[&a] = a+a;
相当于:
int a = 3;
a = a + a;
相当于:
int a = 3;
a = 6;
最终相当于:
int a = 6;
在典型的专业软件工程环境中,有效等同于:
int a = 6; /* Please reject this submitted code and consider firing me. */
答案 1 :(得分:4)
C中的数组下标有点奇怪。该标准将E1[E2]
定义为等同于*(E1+E2)
。当然,加法是可交换的,所以这相当于*(E2+E1)
。这相当于E2[E1]
...
考虑到这一点,你的第二行变为:
(&a)[0] = a+a;
您可能同意的相当于:
*(&a) = a+a;
或
a = a+a;