缘起大一下学期,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. 关于JS变量提升的一些坑

    function log(str) { // 本篇文章所有的打印都将调用此方法 console.log(str); } 函数声明和变量声明总是会被解释器悄悄地被“提升”到方法体的最顶部 变量声明.命名 ...

  2. JAVA 8 函数式接口 - Functional Interface

    什么是函数式接口(Functional Interface) 其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法. 这种类型的接 ...

  3. 【转发】NPAPI开发详解,Windows版

    NPAPI开发详解,Windows版 9 jiaofeng601, +479 9人支持,来自Meteor.猪爪.hanyuxinting更多 .是非黑白 .Yuan Xulei.hyolin.Andy ...

  4. SQL Server 2012实施与管理实战指南(笔记)——Ch6连接的建立和问题排查

    6.连接的建立和问题排查 会话的建立分成2个部分: 1.连接,即找到这个实例 2.认证,告诉sql server谁要连接 目录 6.连接的建立和问题排查 6.1协议选择和别名 6.1.1 服务器网络配 ...

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

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

  6. Java高级编程之URL处理

    Java URL处理 URL(Uniform Resource Locator)中文名为统一资源定位符,有时也被俗称为网页地址.表示为互联网上的资源,如网页或者FTP地址. 本章节我们将介绍Java是 ...

  7. Runtime.exec() sucks!!!!

    自己项目中使用到了 Runtime rt = Runtime.getRuntime(); Process p = rt.exec("query session");p.waitFo ...

  8. 使用ImitateLogin模拟登录百度

    在之前的文章中,我已经介绍过一个社交网站模拟登录的类库:imitate-login ,这是一个通过c#的HttpWebRequest来模拟网站登录的库,之前实现了微博网页版和微博Wap版:现在,模拟百 ...

  9. 查看Android支持的硬解码信息

    通过/system/etc/media_codecs.xml可以确定当前设备支持哪些硬解码.通过/system/etc/media_profiles.xml可以知道设备支持的具体profile和lev ...

  10. python关键字,运算符

    关键字: and且 or 或 not否 del import导入 from import的来源 whilewhile循环 for for循环 if elif else条件结构 break contin ...