pintf函数
printf链式输出时,从右向左运算,运算完毕后,依次从左往右代入各个值;
赋值状态和非赋值状态(参杂个人理解):
赋值状态:指的是++a、--a、a%=5、a等类似操作(++、--在前可以看为a+=1)
c=++a;//分解
c=a=a+1;//赋值语句
非赋值状态:指a--、a++类似会先取a的值,赋值状态就结束了
c=a++;//分解
c=a; //赋值语句
a=a+1;
写出上面两个分解的原因,在单独使用这类运算符时:
前置运算符对原来数的变化会体现在本次运算里,a会影响到我们后续的运算或者输出操作。
后置运算符则先取值最后自增但此时相当于我们有一个临时变量c存了a原先的值,我们用这个值去做输出运算操作,后续a怎么样就不管了。
例①
int a=1;
printf("%d ",a--);
printf("%d ",a);
printf("%d ",--a);
printf("%d ",a++);
printf("%d\n",++a);
//这个可以说是最基础的输出语句
//结果:1 0 -1 -1 1
例②
int a=1;
printf("%d %d %d %d %d\n",a--,a,--a,a++,++a);
//例①中同样的表达式,只是把语句换成链式输出现在的结果还会和例①中一样吗?可以编译运行一下试一试
//绝对不一样接下去我们分析一下
//从右往左分析:
// ++a ++在前相当于 a=a+1 赋值状态 此时a=2
// a++ ++在后则取值 后续与a无关 a自增 此时a=3 输出为2
// --a --在前相当于 a=a-1 赋值状态 此时a=2
// a 要输出a需要看后续a的变化 赋值状态 此时a=2
// a-- --在后则取值 后续与a无关 a自减 此时a=1 输出为2
//运算完毕开始输出此时输出语句已经可以看成
printf("%d %d %d %d %d\n",2,a,a,2,a);
//结果:2 1 1 2 1
例③
int a = 1;
printf("%d %d %d %d %d %d %d %d\n",a,a--,a,--a,a,a++,a,++a);
//从右往左分析:
// ++a ++在前相当于 a=a+1 赋值状态 此时a=2
// a 要输出a需要看后续a的变化 赋值状态 此时a=2
// a++ ++在后则取值 后续与a无关 a自增 此时a=3 输出为2
// a 要输出a需要看后续a的变化 赋值状态 此时a=3
// --a --在前相当于 a=a-1 赋值状态 此时a=2
// a 要输出a需要看后续a的变化 赋值状态 此时a=2
// a-- --在后则取值 后续与a无关 a自减 此时a=1 输出为2
// a 要输出a需要看后续a的变化 赋值状态 此时a=1
//运算完毕开始输出此时输出语句已经可以看成
printf("%d %d %d %d %d %d %d %d\n",a,2,a,a,a,2,a,a);
//结果:1 2 1 1 1 2 1 1
前两个解析看完有没有一点思路呢,接下去进阶版
例④
int a=1;
printf("%d %d %d %d %d %d\n",a=7,a--,++a,4*(a-4),a++,a*=3)
//从右往左分析:
// a*=3 a=a*3 赋值状态 此时a=1*3=3
// a++ ++在后则取值 后续与a无关 a自增 此时a=4 输出为3
// 4*(a-4) a-4没有赋值,后续与a无关 计算出结果 此时a=4 输出为0
// ++a ++在前相当于 a=a+1 赋值状态 此时a=5
// a-- --在后则取值 后续与a无关 a自减 此时a=4 输出为5
// a=7 明显的赋值语句 赋值状态 此时a=7
//运算完毕开始输出此时输出语句已经可以看成
printf("%d %d %d %d %d %d\n",a,5,a,0,3,a)
//结果:7 5 7 0 3 7
例⑤
int a = 1,b=3;
printf("%d %d %d %d %d %d %d\n",b+=a+3,a*b++,(b+4)*(++b),a-b,b=5,a=4,a+=3*b);
//从右往左分析:
// a+=3*b a=a+b*3 赋值状态 此时a=1+3*b=10 b=3
// a=4 明显的赋值语句 赋值状态 此时a=4 b=3
// b=5 明显的赋值语句 赋值状态 此时a=4 b=5
// a-b a-b无赋值直接得结果 4-5=-1 此时a=4 b=5 输出为-1
// (b+4)*(++b) b+4=9 ++b ->b=b+1 需要注意此时b=b+1为赋值状态但是计算完括号
// 后得到8*b不是赋值状态 此时要以当前这个小式子中b的最终值作为++b的结果进行运算
// 9*b 此时a=4 b=6 输出为54
// a*b++ b++直接取b的值 4*6=24 此时a=4 b=7 输出为24
// b+=a+3 b=b+a+3 赋值状态 此时a=4 b=14
//运算完毕开始输出此时输出语句已经可以看成
printf("%d %d %d %d %d %d %d\n",b,24,54,-1,b,a,a);
//结果:14 24 54 -1 14 4 4
例⑥
int a = 1,b=3;
printf("%d %d %d %d\n",b=a,a*(++b),(++b)*(b++),(++b)*(++b));
//从右往左分析:
// (++b)*(++b) ++b是赋值语句但是当两个++b相乘时最后就是 b*b此时以这个小式子b的最终值进行运算
// 此时a=1 b=5 b*b=25 输出25
// (++b)*(b++) ++b是赋值语句得到b=6,b++不是赋值语句得到 6可能现在会有朋友觉得这一个小式子答
// 案就是36,那就错了因为b++取完6之后b自增变成7了 这个小式子b的最终值进行运算
// 此时a=1 b=7 6*7=42 输出42
// a*(++b) 可能会有朋友认为a不是等于1吗,那a*(++b)就相当于 ++b这其实不对
// ++b没有与其他数运算只是本身寄存器的操作,而这个小式子还与a发生了关系
// 此时a=1 b=8 1*8=8 输出8
// b=a 赋值语句 赋值状态 此时a=1 b=1
//运算完毕开始输出此时输出语句已经可以看成
//printf("%d %d %d %d\n",b,8,42,25);
//结果:1 8 42 25
总结:printf链式输出的值必定是一个确定值或者一个变量,变量根据变量的最终值输出。
以上就是个人对Printf链式输出的一些浅薄理解,如果各位觉得写的不好请轻喷(全程自己编写,如果觉得有帮助动动你的小手点个赞吧,拜谢)