首页 > 后端开发 > C++ > C 和 C 中的'2[arr]”等于'arr[2]”:交换数组访问吗?

C 和 C 中的'2[arr]”等于'arr[2]”:交换数组访问吗?

Susan Sarandon
发布: 2024-11-25 14:42:11
原创
796 人浏览过

Does `2[arr]` Equal `arr[2]` in C and C  : A Commutative Array Access?

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板