继承[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. Android系统环境变量配置

    ANDROID_HOME D:\Program Files\Android-sdk D:\AndroidSDK\android-sdk ANDROID_SDK_HOME %ANDROID_HOME% ...

  2. iOS 键盘弹出遮挡输入框

    #pragma mark 键盘弹出遮挡输入框 //开始编辑输入框的时候,软键盘出现,执行此事件 -(void)textFieldDidBeginEditing:(UITextField *)textF ...

  3. Scala入门指南与建议

    最近在学习使用Scala语言做项目,感觉这门语言实在是太优美了!作为一个本科数学.研究生机器学习专业的混合人才(哈哈),这门语言真的是满足了普通计算机编程(告诉计算机怎么做)和函数式编程(告诉计算机做 ...

  4. JavaScript基本概念(数组)

    1.数组方法 /** * join(str) * 将数组元素转换为字符串并使用参数中的字符串将各字符串链接起来 */ var a = [1, 2, 3]; a.join(); // "1,2 ...

  5. Flink Program Guide (5) -- 预定义的Timestamp Extractor / Watermark Emitter (DataStream API编程指导 -- For Java)

    本文翻译自Pre-defined Timestamp Extractors / Watermark Emitter ------------------------------------------ ...

  6. codevs 1913 数字梯形问题 费用流

    题目链接 给你一个数字梯形, 最上面一层m个数字, 然后m+1,......m+n-1个. n是层数. 在每个位置, 可以向左下或右下走.然后让你从最顶端的m个数字开始, 走出m条路径, 使得路过的数 ...

  7. 12行代码 让浏览器崩溃,iPhone重启

    <html> <body> <script> var total=""; for (var i=0;i<1000000;i++) {    ...

  8. 欧几里得求最大公约数--JAVA递归实现

    欧几里得算法求最大公约数算法思想: 求p和q的最大公约数,如果q=0,最大公约数就是p:否则,p除以q余数为r,p和q的最大公约数即q和r的最大公约数. java实现代码: public class ...

  9. PixelFormat 图像颜色的数据格式

    PixelFormat: (指定图像中每个像素的颜色数据的格式) Delphi                                        微软                    ...

  10. fragment中listview触发事件setOnItemClickListener不好使

    <listView/>中// listview点击 ,高度wrap_content改成fill_prarent