【发布时间】:2011-07-01 16:41:33
【问题描述】:
有些面试官出于某种原因喜欢问这个小技巧问题:
int arr[] = {1, 2, 3};
2[arr] = 5; // does this line compile?
assert(arr[2] == 5); // does this assertion fail?
据我所知,a[b] 被转换为 *(a + b),并且由于加法是可交换的,所以它们的顺序并不重要,所以 2[a] 真的是 *(2 + a) 并且效果很好。
这是否保证符合 C 和/或 C++ 的规范?
【问题讨论】:
-
这在Hidden features of C++中被提及。
-
@erickb - 这个问题专门询问这是否是(非常流行的)实现侥幸,或者这是否是标准规定的。
-
在这种特定情况下,您将收到关于
a未定义的错误(因为您的声明声明了arr,而不是a),但我认为每个人都了解您实际上是什么问... -
你甚至可以对字符串指针感到疯狂。 “abcd”[1] 是“b”。或者给你 1["abcd"].
标签: c++ arrays c square-bracket subscript-operator