缘起大一下学期,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. 分享 | Git常用的一些命令

    最近,各个项目团队已经全面从svn转向Git 近期将会分享一些Git的常用操作及使用经验: 先了解下工作中一些需要用到的命令: --------------------------- Git基本常用命 ...

  2. [整理]PHP/HTML混写的四种方式

    PHP作为一款后端语言,为了输出给浏览器让浏览器呈现出来,无可避免的要输出HTML代码,下文介绍下我用过的三种PHP/HTML混编方法 1.单/双引号包围法 这是最初级的方法了,用法就像下面这样 &l ...

  3. Linux账号密码过期会导致crontab作业不能执行

    今天一同事报告Linux服务器上的crontab作业没有运行,检查/var/log/cron日志后发现下面错误信息 Jan 19 16:30:01 xxxx crond[31399]: Authent ...

  4. 0010《SQL必知必会》笔记06-表的修改与删除

    1.表的修改: 1.1 删除列:ALTER TABLE 表名 DROP COLUMN 列名 1.2 添加列:ALTER TABLE 表名 ADD(列名 数据类型) 1.3 修改列名:ALTER TAB ...

  5. SQLServer修改字段类型

    Alter table [表名] Alter column [列名] [列类型]

  6. java 生成 csv文件

    一.csv文件 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文本意味着该文件是 ...

  7. MySQL创建索引语法

    1.介绍: 所有mysql索引列类型都可以被索引,对来相关类使用索引可以提高select查询性能,根据mysql索引数,可以是最大索引与最小索引,每种存储引擎对每个表的至少支持16的索引.总索引长度为 ...

  8. 地图编辑器V3

    V3.2.4 (2014-07-03) ---------------------------1. 保存地图的锁定与可视状态:2. 地图单独存为map格式结尾的文件与导出的XML文件区别:3. 修正瓷 ...

  9. AngularJS笔记---数据绑定

    一.数据绑定 1.简单绑定 下面实现了一个简单的加法运算的绑定, A.ng-app:表示该div以内都在AngularJS的应用, 去掉ng-app="" 那么后面的绑定都将无效 ...

  10. c++关于析构的那点小事(个人吐槽向

    #include<iostream> using namespace std; class test { int *i; public: test(int n) { i = new int ...