谜题:“[]是对称的”?
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
个元素(从零开始计数)。
我正在尝试解开这个谜团:
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
个元素(从零开始计数)。