在 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] 可以解释为指针操作:
至关重要的是,标准中没有要求 [] 的参数顺序保持合理。因此,表达式 2[arr] 被视为等价于 (*((2) (arr)))。
因此,赋值和后续断言都成功,如预期。
以上是2[arr] = 5 是否在 C 和 C 中编译并通过断言?的详细内容。更多信息请关注PHP中文网其他相关文章!