关于printf函数的思考
2015-07-26 00:00
381 查看
#include<stdio.h>
int main(void)
{
int a = 10, b = 20, c = 30;
printf("\n %d..%d..%d \n", a+b+c, (b = b*2), (c = c*2));
return 0;
}
知识点:printf函数在处理参数的时候是从右向左处理的,即先处理(c = c*2),再处理(b = b*2),再处理a+b+c,最后处理"\n %d..%d..%d \n"。其中,printf最后三个参数从右向左依次压入栈中,存放在栈中从高到低的地址里面,然后再格式化输出,输出时从低地址到高地址输出。即整个操作可以看做两部分:数据的处理(压栈)和格式化的输出(出栈)。
#include<stdio.h>
int main(void)
{
int a = 10;
printf("\n %d %d\n",a);
return 0;
}
在这个简短的程序中呢,在linux下和windows下(vc6.0)输出结果是不一样的。
windows下(vc6.0):输出10和0;
Linux下:(会有警告)输出10和一个不确定的数。
那么在此我们可以体会出,由于printf里本应该有两个参数用来输出值的,我们只提供了一个,而需要输出两个值。对于另外一个不确定的值,对于不同的环境则会有不同的处理办法。但是,也仅仅是作为一个不确定的数,其实某种程度上相当于一个未定义的变量。
int main(void)
{
int a = 10, b = 20, c = 30;
printf("\n %d..%d..%d \n", a+b+c, (b = b*2), (c = c*2));
return 0;
}
知识点:printf函数在处理参数的时候是从右向左处理的,即先处理(c = c*2),再处理(b = b*2),再处理a+b+c,最后处理"\n %d..%d..%d \n"。其中,printf最后三个参数从右向左依次压入栈中,存放在栈中从高到低的地址里面,然后再格式化输出,输出时从低地址到高地址输出。即整个操作可以看做两部分:数据的处理(压栈)和格式化的输出(出栈)。
#include<stdio.h>
int main(void)
{
int a = 10;
printf("\n %d %d\n",a);
return 0;
}
在这个简短的程序中呢,在linux下和windows下(vc6.0)输出结果是不一样的。
windows下(vc6.0):输出10和0;
Linux下:(会有警告)输出10和一个不确定的数。
那么在此我们可以体会出,由于printf里本应该有两个参数用来输出值的,我们只提供了一个,而需要输出两个值。对于另外一个不确定的值,对于不同的环境则会有不同的处理办法。但是,也仅仅是作为一个不确定的数,其实某种程度上相当于一个未定义的变量。
相关文章推荐
- Hive Failed with exception Unable to rename
- 暴力的java版微型计算器
- 怎么判断android中ScrollView滑动到了最底部?
- Qt学习心得之网络编程简单的局域网聊天服务端建立
- 原生js-获取DOM属性-getStyle()
- JAVA死锁和避免死锁
- JAVA内存泄露和内存溢出
- jQuery Validate验证框架详解
- 最舒服的颜色搭配,包含RGB值。作图或设计参考。
- 项目:拼图游戏(一)
- Trie树词频统计实例
- 写blog的目的
- Split-文件的切割
- MergeFile-碎片文件的合并
- 对象的持久化存储
- Java堆内存的10个要点
- JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解
- 性能分析工具之-- Eclipse Memory Analyzer tool(MAT)(一)
- 性能分析工具之-- Eclipse Memory Analyzer tool(MAT)(二)
- 性能分析工具之-- Eclipse Memory Analyzer tool(MAT)(三)