数组操作结果

SP6*_*SP6 2 c arrays

有人可以让我更深入地了解为什么这段代码的工作方式

#include <stdio.h>

int main()
{
    int a[5] = {1,2,3,4,5};
    int i;
    for(i=0;i<5;i++)
    {
     printf("%d,%d \n",i[a],i[a]++);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果是

2,1 
3,2 
4,3 
5,4 
6,5 
Run Code Online (Sandbox Code Playgroud)

谢谢

Kei*_*son 5

行为未定义.

N1256 6.5p2:

在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,先前的值应该只读以确定要存储的值.

程序既修改i[a](in i[a]++)又读取其值(在下一个参数中),并且读取该值的结果不用于确定要存储的值.

不仅仅是函数参数评估的未指定顺序问题; 事实上,i[a]++和之间没有序列点i[a](因为那不是逗号运算符)意味着行为,而不仅仅是结果,是未定义的.