Printf链式输出浅层分析

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链式输出的一些浅薄理解,如果各位觉得写的不好请轻喷(全程自己编写,如果觉得有帮助动动你的小手点个赞吧,拜谢)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值