printf函数对参数的计算顺序,是从右往左的(输出是从左向右的)
2015-07-02 15:48
453 查看
1.Printf:
例:
[cpp] view
plaincopy
#include<stdio.h>
void main()
{
int i=2;
printf("%d,%d,%d,%d,\n",i++,++i,i,i++);
printf("%d\n",i);
}
首先,应该说明的是在不同的编译环境中结果是不一样的。
关于本段代码在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
plaincopy
#include <stdio.h>
void main()
{
int a=5,b=2;
printf("%d %d\n",b=a+1,a=a+1);
}
输出结果是: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
例:
[cpp] view
plaincopy
#include<stdio.h>
void main()
{
int i=2;
printf("%d,%d,%d,%d,\n",i++,++i,i,i++);
printf("%d\n",i);
}
首先,应该说明的是在不同的编译环境中结果是不一样的。
关于本段代码在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
plaincopy
#include <stdio.h>
void main()
{
int a=5,b=2;
printf("%d %d\n",b=a+1,a=a+1);
}
输出结果是: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
相关文章推荐
- iOS ASIHttpRequest 和 AFNetWorking 实时监测下载进度
- iOS开发范例实战宝典(基础篇)
- 回溯法(1)
- 二叉查找树实现-双向链表
- getopt函数的使用——分析命令行参数
- IOS 错误:error: unknown type name 'UIImageView'
- crontab使用详解
- 正则表达式 Pattern
- python实现在控制台输入密码不显示的方法
- 如何使用Android Studio把自己的Android library分享到jCenter和Maven Central
- 浅谈如何推翻GRE阅读的固定思维
- c++正则表达式日期格式匹配
- Java学习笔记七(文件夹操作)
- selector资源的两种使用方式
- yum更新源
- 自适应网页设计(Responsive Web Design)
- textview字体的高度
- 回溯算法
- 判断浏览器 插件 jquery.ua.js
- 关于ffmpeg avcodec_open2函数失败的问题