#include<stdio.h>
// 函数的入参是表达式的时候,先完成对各表达式求值(求值顺序不定)
// 然后, 再将求值完成后得到的变量(或表达式返回的临时对象)的结果初始化行参。
// (注意,在执行被调函数前的最后时刻,副作用生效)
// 注意:表达式 ++i 和 --i 作为函数入参, 其本质是将i自身作为入参,因为2者返回的是对象(运算过的)自己
// 所以, 函数在初始化形参时,使用的自然是i(毕竟,返回值是自己嘛)
// i--和i++则返回的是i的副本(并非i)
// 但,对于操作符, 取的是表达式的当前返回的结果
// 例如: *++p; 假定(其实必定,就算先运算*(++p) 子表达式)先运算子表达式++p,
// 其运算结果在下一个顺序点到来之前,可能未从寄存器cpoy到内存。
// 而*操作符需要的只是对++p当前返回的(寄存器运算)结果进行处理
int main()
{
int i=1;
int j=2;
int a = 100;
int b = 200;
int c = 300;
int d = 400;
int e = 500;
printf("%d%d%d\n",(--i),(++i),i);
printf("%.3f a=%d b=%d\n",1.0,a,b);
/*
111
1.000 a=100 b=200
*/
// printf("%d%d%d\n",(b = --i),(a = ++i),i);
// printf("%.3f a=%d b=%d\n",1.0,a,b);
/*result:
121
1.000 a=2 b=1
*/
i = 1;
printf("%d%d%d%d%d%d%d\n",i,(e = i++),(d = i--),(c = --i),(b = ++i),(a = ++i),i);
printf("a=%d b=%d c=%d d=%d e=%d\n",a,b,c,d,e);
/*
2122322
a=2 b=3 c=2 d=2 e=1
*/
// printf("j=%d%d\n", ++j, (++j));
// printf("j=%d\n", j);
/*
j=44
j=4
*/
printf("j: %d %d\n", --j, ++j);
printf("j=%d\n", j);
/*
j: 2 2
j=2
*/
// 并非编译器优化的结果,而是先完成对各表达式求值(求值顺序不定)
// (注意,在执行被调函数前的最后时刻,副作用生效),最后j=2,
// 所以输出2 2
// printf("j: %d %d\n", j--, j++);
// printf("j=%d\n", j);
/*
j: 3 2
j=2
*/
// printf("j: %d %d\n", j--/*copy此时j的值给副本,j-1,返回副本,即实际打印了副本内容*/, ++j/*打印各入参表达式求值完成后,j最终的值*/);
// printf("j=%d\n", j);
/*
j: 3 2
j=2
*/
return 0;
}
C/C++ 求值顺序example 2,布布扣,bubuko.com
C/C++ 求值顺序example 2