请解释这段C代码的输出

请解释这段C代码的输出,c,arrays,C,Arrays,我无法理解循环体中的第一行 如何解释这一说法: printf%d,i++[a] 输出 1,12,23,34,45,5第一行 printf("%d", i++[a]); 打印数组的第i个元素,然后递增i 记住,C++中的[42 ]和42 [A]是完全相同的,因为地址+偏移与遮罩下的偏移+地址相同。 这与以更传统的方式编写的内容相同: printf("%d", a[i++]); 这个 其中a是一个有效的数组,因为a[i]和i[a]是相同的。在这种特殊情况下,后期增量++会在稍后发生,即首先执行i

我无法理解循环体中的第一行

如何解释这一说法: printf%d,i++[a]

输出

1,12,23,34,45,5第一行

printf("%d", i++[a]);
打印数组的第i个元素,然后递增i

记住,C++中的[42 ]和42 [A]是完全相同的,因为地址+偏移与遮罩下的偏移+地址相同。 这与以更传统的方式编写的内容相同:

printf("%d", a[i++]);
这个

其中a是一个有效的数组,因为a[i]和i[a]是相同的。在这种特殊情况下,后期增量++会在稍后发生,即首先执行i[a],然后执行i增量

来自C标准

6.5.2.1阵列订阅

后缀表达式后跟方括号中的表达式[] 是数组对象元素的子脚本指定。这个 下标运算符[]的定义是E1[E2]为 与*E1+E2相同。因为转换规则 如果E1是数组对象,则应用于二进制+运算符 等价地,指向数组对象初始元素的指针 E2是一个整数,E1[E2]指定 E1从零开始计数


循环部分可以用这种形式重新编写,因为它们完全相同

我们知道a[1]和1[a]是相同的东西,数组的第二个成员

for(int i=0; i<5; i+2){
    printf("%d", a[++i]);
    printf(",%d",i);
}
作为旁注,for循环第三部分中的i+2是无用的,可以删除

for(int i=0; i<5;){
    printf("%d", a[++i]);
    printf(",%d",i);
}

a[i]和i[a]是相同的。

forint i=0;我知道。。downvotes@ishon19但也增加了选票;注意:i的增量可以在访问数组元素之前或之后发生。在C18之前的C中,我不知道规则是否随最新版本而更改,在I++[a]中没有对操作顺序的要求。@pmg我相信你是不对的。i++将在递增之前使用i的当前值++我将首先递增,然后使用i的值。我相当肯定这在数组索引的上下文中定义得很好。由Achal提供的答案提供了C标准的章节,但这对于C++是相同的。假设i= 0,I++[A]…可能只有预C18执行i=1中的任一项;a[0];或ba[0];i=1@我仍然不同意。请指向支持您的参数的C++标准的一部分。我相信你找不到。@JesperJuhl:
for(int i=0; i<5; i+2){
    printf("%d", a[++i]);
    printf(",%d",i);
}
printf("%d", a[i]);
i++;
for(int i=0; i<5;){
    printf("%d", a[++i]);
    printf(",%d",i);
}
printf("%d", i++[a]);