缘起大一下学期,C语言程序设计徐小青老师的随口一提,经娄嘉鹏老师提醒,我觉得应该自己整理清楚这一问题。涉及网上资料将会标明出处。

关于printf函数的所思所想


* printf的定义

printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。

格式输出,它是c语言中产生格式化输出的函数(在 stdio.h 中定义)。用于向终端(显示器、控制台等)输出字符。

格式控制由要输出的文字和数据格式说明组成。

原型:extern int printf(const char *format,...);

**参考百度百科词条 http://baike.baidu.com/view/410546.html **

* printf函数-c源码

从课程原因角度考虑,我搜索了一下printf函数的c源码。

    ...
switch (cntrl_string[pos]) {
    case 'c':
  putchar (va_arg (ap, unsigned char));
  cnt_printed_chars++;//已经被printf输出的字符个数
  break;
...
case 's':
  chptr = va_arg (ap, unsigned char*);//cnptr是用来在处理字符串时的位置指针
  i = 0;
  while (chptr [i]) {
   cnt_printed_chars++;
   putchar (chptr [i++]);}
break;
...

在上述代码中引用了 int putchar (int c),同样以switch-case语句为主体,

至于void printChar (const byte ch),个人还看不懂

**参考sgq116300博客 http://blog.csdn.net/sgq116300/article/details/1863384 **

另一个版本在linux内核中的printf源码,仅用了252行

**参考ChinaUnix博客 http://blog.chinaunix.net/uid-24567872-id-87686.html **

* printf函数-汇编语言代码

因为徐小青老师课上同样提到了汇编语言,这也是信息安全专业的课程之一。在程序设计课程中使用的codeblock已经用编译器完成了汇编。

在知乎网友Milo Yip关于“学习汇编有什么好处”的回答中提到,

“汇编是一般程序員能为机器编程的底层语言(现代的CPU/GPU还会把指令再分解成微指令),所以学习汇编能让程序員知道机器在软件层面上的最底层操作。”

在博友范志东(Florian)的《printf背后的故事一文中》,详细的描述了printf的调用轨迹,但因为个人能力有限我没有看懂glibc源代码中的printf源码。

仅就函数调用做了记录:

_IO_puts => _IO_sputn => _IO_XSPUTN => __xsputn => _IO_file_xsputn => _IO_new_file_xsputn

=> _IO_OVERFLOW => __overflow => _IO_new_file_overflow

=>_IO_do_write =>_IO_new_do_write

=> new_do_write

=>_IO_SYSWRITE => __write() => write() => _IO_new_file_write

=>write_not_cancel => write_nocancel

=> INLINE_SYSCALL  => INTERNAL_SYSCALL =>__kernel_vsyscall

**参考Florian博客 http://www.cnblogs.com/fanzhidongyzby/p/3519838.html **


综上分析:徐小青老师提及的上千行代码可能指的是汇编语言下的printf函数代码。

关于printf函数的所思所想的更多相关文章

  1. 可变参数列表与printf()函数的实现

    问题 当我们刚开始学习C语言的时候,就接触到printf()函数,可是当时"道行"不深或许不够细心留意,又或者我们理所当然地认为库函数规定这样就是这样,没有发现这个函数与普通的函数 ...

  2. printf函数

    printf函数的格式及含义 d                    以十进制带符号的形式输出整数(对正数不输出符号) o                    以八进制无符号的形式输出整数(不输出 ...

  3. Linux Linux下特殊的printf函数和fputs函数

    Linux下,printf函数必须以'\n'结尾才会立刻输出到屏幕,如果没有'\n'直到输出缓冲区满了以后才会打印到屏幕上(敲击换行也算),如果需要不换行的输出,一般可以使用write函数代替.'\n ...

  4. C语言printf()函数:格式化输出函数

    C语言printf()函数:格式化输出函数 头文件:#include <stdio.h> printf()函数是最常用的格式化输出函数,其原型为:     int printf( char ...

  5. 关于printf函数输出先后顺序的讲解!!

    对于printf函数printf("%d%d\n",a,b);函数的实际输出顺序是这样的先计算出b,然后在计算a,接着输出a,最后在输出b:例子如下:#include<ios ...

  6. printf()函数

    printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息. printf()函数的调用格式为: printf("<格式化字符串>", <参 ...

  7. C 中 关于printf 函数中度剖析

    题外话  这篇博文主要围绕printf函数分析的,主要讲解printf 使用C的可变参数机制, printf是否可重入(是否线程安全), printf函数的源码实现. 正文 1.C中可变参数机制 我们 ...

  8. printf函数重定向

    printf函数底层会调用fputc函数 /*重定向c库函数printf到USART1*/ int fputc(int ch, FILE *f) { /*发送一个字节数据USART1 */ USART ...

  9. php中sprintf与printf函数用法区别

    下面是一个示例:四舍五入保留小数点后两位  代码如下 复制代码 <?php$num1 = 21;echo sprintf("%0.2f",$num1)."<b ...

随机推荐

  1. Asp.net WebPages框架运行原理浅析(转)

    在Asp.net4和4.5中,新增了WebPages Framework,编写页面代码使用了新的Razor语法,代码更加的简洁和符合Web标准,编写方式更接近于PHP和以前的Asp,和使用 WebFo ...

  2. EMC Documentum DQL整理(一)

    1.Get user SELECT * FROM dm_user WHERE r_is_group = 0   2.Get Group SELECT * FROM dm_group WHERE gro ...

  3. 8、需求分析师要阅读的书籍 - IT软件人员书籍系列文章

    需求分析是软件项目开始阶段重要的一步.而需求分析是项目经理或产品经理需要经历的一环,所以说需求分析是项目经理或产品经理需要具备的知识.但是,项目角色中却分离出了需求分析师这个角色,也就是说,在大型的或 ...

  4. Aptana Studio 3 汉化简体中文版

    最近开始学习ruby on rails了,同事推荐我用aptana这个编辑器,它对ror的支持比较好,所以安装了这个软件,但是发现都是英文的,所以在网上看汉化教程,幸亏有高手写过这个文章了,这里我只是 ...

  5. 从MVC框架看MVC架构的设计

    尽管MVC早已不是什么新鲜话题了,但是从近些年一些优秀MVC框架的设计上,我们还是会发现MVC在架构设计上的一些新亮点.本文将对传统MVC架构中的一些弊病进行解读,了解一些优秀MVC框架是如何化解这些 ...

  6. Memcache知识点梳理

    Memcache知识点梳理 Memcached概念:    Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HAS ...

  7. 谷歌/微软/必应web页面免费翻译插件

    随着网络时代的日益壮大,现在我们经常需要浏览一些各种外语的网页,或者是查阅资料帮助我们解决问题.更多的时候还是头疼在语言障碍上,正所谓"它认识你,你不认识它啊."谷歌和微软两个企业 ...

  8. 【hbase】——HBase 写优化之 BulkLoad 实现数据快速入库

    1.为何要 BulkLoad 导入?传统的 HTableOutputFormat 写 HBase 有什么问题? 我们先看下 HBase 的写流程: 通常 MapReduce 在写HBase时使用的是 ...

  9. oracle函数--trunc

    作用:截取 语法:trunc(date,[fmt])   TRUNC函数,ORA-01898 精度说明符过多 TRUNC(SYSDATE)即可默认当前日期(年月日),---写到这一步就好了 TRUNC ...

  10. To create my first app in iOS with Xcode(在Xcode创建我的第一个iOS app )

    To create my first app in iOS create the project. In the welcome window, click “Create a new Xcode p ...