谜题:“[]是对称的”?

Puzzle: "[] is symmetric"?

我正在尝试解开这个谜团:

int direction = 1;
char direction_name = direction["nsew"];

比如为什么它首先编译,它到底想证明什么,它有什么用?


我在一个网站上发现了这段代码,除了“[] 是对称的”之外没有其他相关解释。我的意思是我应该如何处理这些信息..

以下语句:

char direction_name = direction["nsew"];

相当于:

char direction_name = "nsew"[direction];

以及:

char direction_name = *("nsew" + direction); // note that addition is commutative

direction 包含整数值 1,因此您得到 字符串文字 的第二个字母(在 C 数组中从零开始索引)"nsew"(数组类型char[5]),即's'个字符。

此代码等同于:

#include <stdio.h>

int main(void) {
    char direction_name = 1["nsew"];
    printf("[%c]\n",direction_name);
    return 0;
}

其中 will print [s],因为

char direction_name = 1["nsew"]; // "nsew" is string literal, i.e. an array
                                 // of 5 chars 'n' 's' 'e' 'w' '[=11=]'

等于

char direction_name = "nsew"[1];

还有

char direction_name = *("nsew" +1);

因此 [] 在某种意义上是对称的

x[y] == y[x] // if conditions given in C standard 6.5.2.1/2 are met

你可以把[]看作代数中的对称关系(根据6.5.2.1 § 2的假设):

或者,如果您愿意,您可以将 [] 视为 reflexive (Banach) 线性空间 V 和 V** 之间的线性映射(变换,泛函):

x[f] = [f,x] = f[x]

C标准n1124 6.5.2.1 § 2 数组下标(强调main)

后缀表达式后跟方括号中的表达式 [] 是数组对象元素的下标名称。下标运算符[]的定义是E1[E2]等同于(*((E1)+(E2)))。由于适用于二元 + 运算符的转换规则,如果 E1 是一个 数组对象 (等效地,指向数组对象初始元素的指针)并且 E2 是一个 整数 E1[E2] 指定 E1 的第 E2 个元素(从零开始计数)。