1

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?

4

2 回答 2

7

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

正如这个问题中所解释的(使用这个流行的答案我试图提供一些历史背景[]索引运算符是可交换的,所以

0[&a] = a+a;

相当于:

(&a)[0] = a+a;

&aint对象的地址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. */
于 2013-08-30T23:00:49.177 回答
4

C 中的数组下标有点奇怪。该标准定义E1[E2]为等效于*(E1+E2). 当然,加法是可交换的,所以这等价于*(E2+E1)。这使得它相当于E2[E1]...

考虑到这一点,您的第二行变为:

(&a)[0] = a+a;

您可能会同意这相当于:

*(&a) = a+a;

或者

a = a+a;
于 2013-08-30T22:52:19.990 回答