继承[K&R]的传统,我们的第一个C语言程序也是“Hello, World.”。

书写C语言程序的大前提:C语言中的语法符号必须都是英文字符,即在中文输入法关闭状态下输入的字符。

例 1. Hello World

 /*暂且记住只要用到 printf 输出函数,就现在程序开头写上如下一行#include <stdio.h>。*/
#include <stdio.h>
/* main函数是C程序有且只能有一个的主函数(特例除外),C 程序总是从 main 里面的第一条语句开始执行。*/
int main(void)
{
printf("Hello, world.\n");
return ;
}

第1行和第3行的/* ... */结构是一个注释(Comment),其中可以写一些描述性的话,解释这段程序在做什么。注释只是写给程序员看的,编译器会忽略从/*到*/的所有字符,并且不管写多少都不会被编译进可执行文件中。换言之,注释不影响C程序的功能。但这里还是要注意一点,/* ... */结构是不允许嵌套的,如下/* .../*…*/... */结构是错误的嵌套结构。

第4行要多说几句。它包含着函数定义的几个要素:1.函数名,这里的函数名是main;2.函数返回值类型,放在函数名前面空格隔开,这里的int表明main函数的返回值类型是int类型,即整型;3.函数参数,紧跟函数名,用括号括起来,这里的void表明无参数。

第5行到第8行,用一对大括号括“{}”起来的部分称之为函数体,也就是要实现函数功能的语句,要注意C语言中的“;”代表一条语句的结尾,如第6、7行。这里可以看到{}里面的语句比main那一行往里缩进了一些(通常一个制表位,即按一下Tab),虽然并没有这样的规定,但这样做可以让程序结构看起来更清晰,很容易看出哪些语句是属于某个函数或某个模块的。

今天的重点来了,第6行printf语句,我们就从它开始认识C语言的丰富多彩。

首先,这条语句是调用C语言的库函数printf,包含在头文件stdio.h中。而使用C语言库函数时必须在程序中嵌入该函数对应的头文件,用#include <>加到里面就可以了(尖括号内填写文件名),所以我们看到了程序开始部分的#include <stdio.h>。

接下来,我们看函数调用形式:给出函数名,此处为printf;给出参与函数执行的参数,此处为括号里的内容。printf的参数类型是可变的,这里我们先介绍两种情况。

第一种情况如例程1所示,printf函数的参数只有一类,放在双引号内,此时函数功能是将双引号内的字符原样输出在屏幕上。但这里需要注意一类特殊字符,即转义字符。C语言规定斜杠“\”为转义字符,也就是说“\”后跟的字符会失去它的原义而变为其它的内容。在例程中的“\n”就表示换行,而不再是字符n。更多的转义字符可查阅相关资料。例程1运行结果如图:

按上面的介绍,给出如下调用:printf("Hello \n world.\n");,它的输出结果是什么呢?虽然简单,但我们也要知其所以然:双引号里的内容原样输出,于是先输出Hello和一个空格;遇到\n时由于转义所以输出一个换行,接着在下一行继续输出一个空格和world.;又遇到一个\n,所以继续输出一个换行。如图:

第二种情况,printf函数具有两类参数的情况。先看例程2:

  #include <stdio.h>
int main(void)
{
printf("There are %d people in my family.\n", ); /* print the number of people in my family*/
return ;
}

此时printf函数的参数分两类,一类是双引号内的,一类是双引号外的,用逗号隔开了。双引号外面的整数5有什么用呢?它的作用是与括号内的%d这个符号对应的。%d是输出格式符的一种,在这里表示一个整型数据。我们也将这类输出格式符叫做“占位符”。它的作用就好比先告诉printf函数一声,“哥们儿,我先把这个输出位置占下,一会儿输出的时候将双引号外的那个整数放到我这个位置上显示出来。”

这样,整个的输出过程我们就可以这样理解了:首先输出双引号的字符There are ,这时遇到了%d符号,根据提前的告知情况,printf函数便会到双引号外把整数5拿过来放到%d的位置上按照其格式要求显示出来,然后继续输出后面的字符people in my family.最后遇到\n,输出什么内容大家已经很清楚了----换行呗。例程2的运行结果如图:

There are 5 people in my family. 与我们的分析完全一致。

如果双引号内出现两个、三个,甚至更多的占位符呢?这时就需要在双引号外给出更多与之对应的数据,并用逗号隔开(注意:双引号外的第一个数据前就有逗号,千万别丢掉!),数据的先后顺序与占位符出现的先后顺序是一一对应的。如例程3:

例程3输出结果如图:

如果与你的分析一模一样,那么恭喜你,可以继续新的学习了。

最后留个问题:printf("There are %d people in my family.\n", 5); 与printf("There are 5 people in my family.\n");  输出结果完全一样,它们的本质有何不同?从文中就可以找到答案。

初识C(2)---从printf函数开始的更多相关文章

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

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

  2. printf函数

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

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

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

  4. 关于printf函数的所思所想

    缘起大一下学期,C语言程序设计徐小青老师的随口一提,经娄嘉鹏老师提醒,我觉得应该自己整理清楚这一问题.涉及网上资料将会标明出处. 关于printf函数的所思所想 * printf的定义 printf( ...

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

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

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

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

  7. printf()函数

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

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

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

  9. printf函数重定向

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

随机推荐

  1. strutr2运行流程

    1. 请求发送给 StrutsPrepareAndExecuteFilter 2. StrutsPrepareAndExecuteFilter 询问 ActionMapper: 该请求是否是一个 St ...

  2. EC读书笔记系列之18:条款47、48

    条款47 请使用traits classes表现类型信息 记住: ★Traits classes使得“类型相关信息”在编译期可用.它们以templates和“templates特化”完成实现 ★整合重 ...

  3. VirtualBox安装linux增强工具报错

    错误提示: Building the OpenGL support module                         [FAILED] 解决办法 cd /media/VBOXADDITIO ...

  4. ZRender源码分析3:Painter(View层)-上

    回顾 上一篇说到:ZRender源码分析2:Storage(Model层),这次咱看来看看Painter-View层 总体理解 Painter这个类主要负责MVC中的V(View)层,负责将Stora ...

  5. 关于css3的边框的border-radius和border-image用法的详解

      一.圆角边框:IE9.0以前版本不支持   border-radius: 接受8个属性,前四个为x轴,后四个为y轴,以斜杠划分x轴.y轴,即border-radius:左上较 右上角 右下角 左下 ...

  6. Android 自定义下拉刷新ListView

    package com.dwtedx.qq.view; import android.content.Context; import android.util.AttributeSet; import ...

  7. Google TensorFlow深度学习笔记

    Google Deep Learning Notes Google 深度学习笔记 由于谷歌机器学习教程更新太慢,所以一边学习Deep Learning教程,经常总结是个好习惯,笔记目录奉上. Gith ...

  8. Linux07--Shell程序设计03 通配符与正则表达式

    通配符 通配符可用于代替字符. 通常地,星号“*”匹配0个或以上的字符,问号“?”匹配1个字符. 使用情况: 1.文件和目录 在CP/M.DOS.Microsoft Windows和类Unix操作系统 ...

  9. 提高mindmanager 8的启动速度

    提高mindmanager 8的启动速度一连串 发布于:2010-01-13 18:12不少人抱怨mindmanager 8的启动速度较慢,用以下办法配置一下就能解决:1.进入mindmanager ...

  10. iOS多线程系列(1)

    多线程这个概念的接触是蛮早的时候了,当时还是单核单CPU的时候,Thread这个概念已经出现了,当时比较流行的方案是时间片轮流,线程可以优先级抢占,但一次只能运行一个线程,实际上多线程是不能真正并行处 ...