首页 > 后端开发 > C++ > 2[arr] = 5 是否在 C 和 C 中编译并通过断言?

2[arr] = 5 是否在 C 和 C 中编译并通过断言?

Mary-Kate Olsen
发布: 2024-12-03 07:17:10
原创
260 人浏览过

Does 2[arr] = 5 Compile and Pass Assertion in C and C  ?

在 C 和 C 语言中通过索引[array]访问数组

在面试官有时提出的知识测试中,出现以下代码:

int arr[] = {1, 2, 3};
2[arr] = 5; // does this line compile?
assert(arr[2] == 5); // does this assertion fail?
登录后复制

表达式 2[arr] 最初可能会编译失败,因为它似乎正在尝试使用整数作为数组名称来索引数组。然而,这种意想不到的语法在 C 和 C 中确实有效。

要理解原因,让我们深入研究这些语言中 [] 运算符的技术细节。

C 和 C数组访问语义

根据 C99 标准(6.5.2.1 第 1 段), [] 运算符需要以下形式的参数:

  • 一个指针对象类型的表达式
  • 一个整数类型的表达式
  • 相同类型的结果表达式作为对象

此外,同一节的第2段解释了E1[E2]相当于(*((E1)(E2)))。这表明表达式 E1[E2] 可以解释为指针操作:

  • E1 被转换为指向数组初始元素的指针。
  • E2 被添加到指针,产生一个指向数组的第 E2 个元素的新指针。
  • 取消引用结果指针将返回所选数组的值

至关重要的是,标准中没有要求 [] 的参数顺序保持合理。因此,表达式 2[arr] 被视为等价于 (*((2) (arr)))。

  • 2(一个整数)被添加到指向第一个元素的指针arr.
  • 结果指针指向 arr.
  • 取消引用结果指针(即访问arr[2]) 将值 5 赋给第三个元素。

因此,赋值和后续断言都成功,如预期。

以上是2[arr] = 5 是否在 C 和 C 中编译并通过断言?的详细内容。更多信息请关注PHP中文网其他相关文章!

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