拼图:“[]是对称的”?

时间:2015-08-14 18:15:37

标签: c arrays variables integer puzzle

我正试图解决这个谜:

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

就像为什么它首先编译一样,它到底想要证明什么以及它用于什么?

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

2 个答案:

答案 0 :(得分:4)

此代码相当于:

#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' '\0'

等于

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的假设下):

enter image description here

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

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

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

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

答案 1 :(得分:3)

以下声明:

char direction_name = direction["nsew"];

相当于:

char direction_name = "nsew"[direction];

以及:

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

direction保存整数值1,因此您将获得 string literal "nsew"的第二个字母(在C数组中从零开始索引)(它是数组类型char[5]),即's'字符。