printf函数对参数的计算顺序,是从右往左的(输出是从左向右的)

1.Printf:

例:

[cpp]  view plain copy
  1. #include<stdio.h>   
  2. void main()   
  3. {   
  4.     int i=2;   
  5.     printf("%d,%d,%d,%d,\n",i++,++i,i,i++);   
  6.     printf("%d\n",i);   
  7. }   

首先,应该说明的是在不同的编译环境中结果是不一样的。 

关于本段代码在VC++6.0中的规则如下: 
1、printf函数的执行顺序是由右到左的 
2、前自增运算符(++i)先加1,再使用i,此时i已经加了1; 
3、后自增运算符(i++)先使用i,再加1,***注意这里是关键所在,VC++6.0后自增运算是要在整条语句结束以后才自加1的!

所以: 
printf("%d,%d,%d,%d,\n",i++,++i,i,i++); 
从右往左运算: 
i++得到2(i=2,后加1在整条语句执行完才进行,这里先记下) 
i还是2 (i=2,原因见上一行) 
++i得到3(i=3,先加1,后使用) 
i++得到3(i=3,后加1在整条语句执行完才进行,这里先记下) 
所以输出结果为:3,3,2,2 
然后计算刚才的两次后自增运算后,i=5 

printf("%d\n",i); 
所以,结果是5

-----------------------------------------------------------------------------------

关于下面的程序:

[cpp]  view plain copy
  1. #include <stdio.h>   
  2. void main()   
  3. {   
  4.        int a=5,b=2;  
  5.        printf("%d %d\n",b=a+1,a=a+1);  
  6. }  

输出结果是:7 6
而不是:6 6

这是因为printf函数的计算是从右向左进行的。


另外关于下面程序的解释:
int i=7; printf("%d\n", i++ * i++); 
输出结果是:49而不是56
int i=7;printf("%d %d\n",++i,i++);
输出结果是:8 7而不是9,7 这并不违背分割新上面关于printf函数从右向左计算的原因。

总结:到这里,要掌握的是两点,

一是:printf函数中的计算是从右向左进行的。

二是:我们在写代码时,应该尽量避免类似下面的无确定意义的表达式出现,因为很有可能不同的编译器,会采用不同的理解方式。
例如:

a+=a++;
a[i]=i++;
printf("%d %d\n",++i,i++);


2.cout

C++角度:
cout << "a=" << a << '\t' << "b=" << b << endl;
系统在运行cout的一系列“<<”操作符,即插入运算符时,先将各表达式的值
从右往左依次存储到缓冲区——————————这相当于printf的入栈;
当刷新缓冲区时,则按从左到右顺序输出————————这相当于printf的出栈
因为插入运算符的结合性为右结合

C/C++都一致的,即都是先运算b,b入栈(存储进缓冲区),运算a,a入栈(存储进缓冲区)
               输出(显示)时,a先出栈(a缓冲区被刷新),b出栈(b缓冲区被刷新)
例:

int ad(int x)

{

cout<<"this ad is used";

return x;

}

int main()

{

int x=10;

cout<<"x="<<x<<"      "<<ad(x);

return 0;

}

这样就应该输出:

this ad is used x=10    10


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值