Recently saw the following chunk of code:
int main()
{
int a = 3;
0[&a] = a+a;//What is this???
}
Could anybody explain, what this means?
这是一些丑陋的代码——但它是完全合法的(在 C 和 C++ 中)。
正如这个问题中所解释的(使用这个流行的答案和我试图提供一些历史背景。[]
索引运算符是可交换的,所以
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. */
C 中的数组下标有点奇怪。该标准定义E1[E2]
为等效于*(E1+E2)
. 当然,加法是可交换的,所以这等价于*(E2+E1)
。这使得它相当于E2[E1]
...
考虑到这一点,您的第二行变为:
(&a)[0] = a+a;
您可能会同意这相当于:
*(&a) = a+a;
或者
a = a+a;