奇怪的阵列签名

gor*_*ill 1 c++ arrays reference

最近看到了以下大块代码:

int main()
{
    int a = 3;
    0[&a] = a+a;//What is this??? 
}
Run Code Online (Sandbox Code Playgroud)

谁有人解释一下,这意味着什么?

Kei*_*son 7

这是一些丑陋的代码 - 但它完全合法(在C和C++中).

正如这个问题所解释的那样(这个流行的答案我尝试提供一些历史背景.[]索引操作符是可交换的,所以

0[&a] = a+a;
Run Code Online (Sandbox Code Playgroud)

相当于:

(&a)[0] = a+a;
Run Code Online (Sandbox Code Playgroud)

&aint对象的地址a.索引运算符采用指针操作数和整数操作数.通常,指针是数组名称(或者等效地,在此上下文中,指向数组的第一个元素的指针).但是,对于索引和指针算术,单个对象可以被视为具有单个元素的数组.

以前的声明是:

int a = 3;
Run Code Online (Sandbox Code Playgroud)

赋值将int对象a视为单个元素数组int,并引用该数组的元素0- 恰好是存在的唯一元素.

之前的值a是3,a+a显然是6.

所以这:

int a = 3;
0[&a] = a+a;
Run Code Online (Sandbox Code Playgroud)

相当于:

int a = 3;
a = a + a;
Run Code Online (Sandbox Code Playgroud)

这相当于:

int a = 3;
a = 6;
Run Code Online (Sandbox Code Playgroud)

这最终相当于:

int a = 6;
Run Code Online (Sandbox Code Playgroud)

在典型的专业软件工程环境中,它实际上相当于:

int a = 6; /* Please reject this submitted code and consider firing me. */
Run Code Online (Sandbox Code Playgroud)