我正试图解决这个谜:
int direction = 1;
char direction_name = direction["nsew"];
就像为什么它首先编译一样,它到底想要证明什么以及它用于什么?
我在一个网站上发现了这个代码,除了“[]是对称的”之外没有相关的解释。我的意思是我应该对这些信息做些什么..
答案 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的假设下):
或者,如果您愿意,可以将[]视为reflexive(Banach)线性空间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'
字符。