代码段
{
int i = 0;
printf("%d, %d\n", i++, i++);
printf("%d, %d\n", ++i, ++i);
printf("%d, %d\n", i++, ++i);
}
结果:
1, 0
4, 4
5, 6
1. 函数参数从右往左入栈
这就解释了,为什么第一行是1,0而不是0,1
2. 关于自增运算符的处理方式
- 前置:从变量地址上读取
- 后置:直接读取临时变量的值
第一行printf 代码相当于
int i = 0;
a = i++; //printf处理后置自加,会创建临时变量存放该值
b = i++;
printf("%d, %d\n", a, b);
第二行printf 代码相当于
int i = 0;
i++; // 第一行printf
i++; // 第一行printf
++i;
++i;
printf("%d, %d\n", i, i); //printf处理前置自加,会去该变量地址上读取
第三行printf 代码相当于
int i = 0;
i++; // 第一行printf
i++; // 第一行printf
++i; // 第二行printf
++i; // 第二行printf
++i; // 第三行printf第二个参数式子
int a = i++;// 第三行printf第一个参数式子,所以第一个参数结果是5
printf("%d, %d\n", a, i);