3

可能重复:
在 C 数组中,为什么这是真的?a[5] == 5[a]
多维数组中的 C 奇怪数组语法

今天我偶然发现了这个博客。最吸引我的是这个:

int i;
i["]<i;++i){--i;}"];

好吧,我真的不知道数组下标中奇怪的“字符串常量”的目的是什么,但我很困惑如何为整数变量下标。所以我带来了这段代码:

#include <stdio.h>

int main(void) {
    int x = 10;

    printf("%d", x["\0"]); /* What is x["\0"]?! */

    return 0;

}

它使用带有-Wall -ansi -pedantic的 MinGW 编译没有错误。然后此代码输出:105。

任何人都可以解释这个吗?

编辑:我发现下标内必须有一个指针,否则我会得到编译时错误。

4

3 回答 3

5

这是数组索引如何工作的结果:

给定一个数组:

int array[5];

然后

array[3]

实际上只是另一种语法

*(array + 3)

因此,这与

*(3 + array)

这意味着你也可以做

3[array]
于 2012-07-05T13:50:56.513 回答
5

C11 标准是这样说的:

6.5.2.1、数组下标

[...]

后缀表达式后跟方括号[]中的表达式是数组对象元素的下标指定。下标运算符的定义[]E1[E2]相同(*((E1)+(E2)))。由于适用于二进制 + 运算符的转换规则,ifE1是一个数组对象(相当于,指向数组对象的初始元素的指针)并且E2是一个整数,E1[E2]指定E2-th 元素 of E1(从零开始计数)。

笔记:

E1[E2]等同于(*((E1)+(E2)))

所以

 E1[E2] = E2[E1]

. 此外,

6.4.5 字符串文字

[...]

然后使用多字节字符序列来初始化一个静态存储持续时间和长度刚好足以包含该序列的数组。对于字符串文字,数组元素具有类型char

因此执行以下操作是有效的:

"foobar"[x];
x["foobar"];
于 2012-07-05T13:53:31.243 回答
4

这是一个众所周知的把戏。由于指针运算的工作方式,以下是同义词:

  • v[5]
  • 5[v]
  • *(v + 5)

v碰巧是字符串文字时也是如此。

于 2012-07-05T13:49:07.693 回答