在 C 和 C 语言中通过索引 [Array] 访问数组:交换好奇心
困扰面试官的神秘问题:
int arr[] = {1, 2, 3}; 2[arr] = 5; // Compiles? assert(arr[2] == 5); // Fails?
直觉表明 a[b] 被翻译为*(a b) 并且,由于加法是可交换的,2[arr] 应等于 *(2 arr)。
标准支持这一点吗?
确实,C 和 C 标准认可这种行为。
C 标准(C99):
第 6.5.2.1 节,第 1 段:
其中一个表达式应具有“指向对象类型的指针”类型,另一个表达式应具有整数类型,并且结果的类型为“type”。
第 2 段(强调添加):
后缀表达式后跟方括号 [] 中的表达式是数组对象元素的下标指定。 下标运算符[]的定义是E1[E2]等同于(*((E1) (E2)))。由于适用于二元运算符的转换规则,如果 E1 是数组对象(相当于指向数组对象的初始元素的指针)并且 E2 是整数,则 E1[E2] 指定 E1 的第 E2 个元素(从零开始计数)。
结论
标准明确指出:无论参数的顺序如何,E1[E2] 等价于 *(E1 E2)。因此,2[arr] 产生与 arr[2] 相同的结果,允许赋值和断言都成功,而不会引起惊讶。
以上是C 和 C 中的'2[arr]”等于'arr[2]”:交换数组访问吗?的详细内容。更多信息请关注PHP中文网其他相关文章!