0

可能重复:
在 C 数组中,为什么这是真的?a[5] == 5[a]

谁能解释一下为什么对于任何数组,表达式 ca[7] == 7[a]都是真的。

有没有可能是假的

我在 wiki 中看到 x[i] 是 *(x+i) 的语法糖,它等于 *(i+x),这是 i[x],但我无法正确理解。

4

3 回答 3

7
  • a[7]相当于*(a + 7)
  • 同样7[a]等价于*(7 + a)

这给出了相同的结果,因为将整数添加到指针是一种可交换操作。


有没有可能是假的

最简洁的答案是不。对于简单的指针算术,它总是正确的。

长答案是,要找到反例,您必须使用 hack。一种方法是使用宏:

#include <stdio.h>

#define a 1+s

int main(void) {
    char s[] = "1q2w3e4r5t6y";
    int x = a[7];
    int y = 7[a];
    printf("%c %c\n", x, y);
    return 0;
}

结果:

s 5

结果是不同的,因为在宏展开之后表达式变得不同:1+(s[7])7[1+s].

在线查看:ideone

于 2012-12-19T08:01:18.007 回答
0

I have seen in wiki that x[i] is a syntactic sugar for *(x+i) and this is equal to *(i+x) and this is i[x], but I can not understand this properly.

它很简单pointer arithmetic,加法是commutative。(所以我认为应该没有什么问题可以理解)

看到这个...

a[7] == *(a+7) == *(7+a) == 7[a]  

a+77+a因为加法运算是可交换的。

因此a[7] == 7[a],证明

于 2012-12-19T08:03:01.980 回答
0

a[7] 被翻译成 *(a+7) & 7[a] 被翻译成 *(7+a),它们指的是相同的位置,因此是相同的数据。

于 2012-12-19T08:02:26.810 回答