根据帖子:With arrays, why is it the case that a[5] == 5[a]?
据称,a[5]
等于 5[a]
。
我问自己,这是真的吗?
虽然我同意 E1[E2] 与 (*((E1)+(E2))) 相同
但我想说:鉴于声明
int a[sizeI];
其中 if (sizeI > 5)
必须为 true
我同意 a[5]
没问题。
但与 ISO/IEC:9899 的引用相关
附录 J.2 未定义的行为:
— An array subscript is out of range, even if an object is apparently accessible with the given subscript (as in the lvalue expression
a[1][7]
given the declaration inta[4][5]
) (6.5.6).
是(如果我从文档中得到正确的结果)5[a]
“显然可以访问”,但“数组下标超出范围”
所以我总体上不同意我链接的OP,
因为 a[5]
在给定的情况下是明确定义的,而 5[a]
是未定义的行为。
那么,我说得对吗?还是我忘记考虑一些重要的事情?
编辑:
我的主张并不意味着
E1[E2] is identical to (*((E1)+(E2)))
这是不正确的。
还有 6.5.2.1 数组下标点 2
只是说它们在算术上是相同的。
但没有说:(*((E1)+(E2)))
无法实现 UB。
因此,虽然我知道这一部分,但我找不到任何可以破坏我主张的内容
另请注意:
正如您在我的第一句话中应该看到的那样, 我正在问一个与“问题”相关的不同问题
With arrays, why is it the case that a[5] == 5[a]?
所以请停止将其标记为该副本的重复项。
最佳答案
要了解为什么附录 J.2 中的注释与 a[b]
兼容,与 *(a + b)
相同,请考虑以下表达式: a[1][7]
被解释(假设声明 int a[4][5]
,如附录中所示):
a[1][7]
与 *(a[1] + 7)
相同。数组 a
的每个元素都是一个五元素数组,因此 a[1]
计算结果为指向五元素数组的第一个元素的指针。如果您将 7 添加到这样的指针,那么生成的指针将指向五元素数组之外,这意味着您不允许取消引用它(标准方面 - 它在实践中可能有效)。但这正是上面表达式的作用。
顺便说一句,附录 J.2 中的注释与 a[5]
与 5[a]
无关。如果数组至少有六个元素,那么在这两个表达式中将元素称为“明显可访问”是合理的。他们只是试图澄清,您不允许访问任何索引溢出的多维数组,即使它看起来不应该溢出多维数组的边界。这只是一个注释 - 您可以独立导出它(如上所述)。
关于c - 为什么 C 数组的 5[a] 不会超出范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29390143/