Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么对于任何C数组,此表达式包含[7]==7[a]_C_Arrays - Fatal编程技术网

为什么对于任何C数组,此表达式包含[7]==7[a]

为什么对于任何C数组,此表达式包含[7]==7[a],c,arrays,C,Arrays,可能重复: 谁能解释一下为什么对于任何数组,表达式c a[7]==7[a]都是真的 有没有可能是假的 我在维基上看到x[I]是*x+I的语法糖,这等于*I+x,这就是I[x],但我不能正确理解这一点 [7]相当于*a+7。 类似地,7[a]相当于*7+a。 这会产生相同的结果,因为向指针添加整数是一种操作 有没有可能是假的 简单的答案是否定的。对于简单的指针算法,它总是正确的 很长的答案是,要找到反例,你必须使用黑客。一种方法是使用宏: #include <stdio.h> #d

可能重复:

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

有没有可能是假的

我在维基上看到x[I]是*x+I的语法糖,这等于*I+x,这就是I[x],但我不能正确理解这一点

[7]相当于*a+7。 类似地,7[a]相当于*7+a。 这会产生相同的结果,因为向指针添加整数是一种操作

有没有可能是假的

简单的答案是否定的。对于简单的指针算法,它总是正确的

很长的答案是,要找到反例,你必须使用黑客。一种方法是使用宏:

#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;
}
结果是不同的,因为在宏展开后,表达式变得不同:1+s[7]与7[1+s]


在线查看:

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

我在wiki中看到x[I]是*x+I的语法糖,这等于*I+x,这就是I[x],但我无法正确理解这一点

它是简单的指针算法,加法是可交换的。所以我不认为有什么问题需要理解

看这个

a[7] == *(a+7) == *(7+a) == 7[a]  
a+7是7+a,因为加法运算是可交换的


因此,a[7]==7[a]证明了它不是重复的。那个问题是关于5的,这个问题是关于7的在搜索之前,考虑检查优秀。
a[7] == *(a+7) == *(7+a) == 7[a]