目录
- C语言快速入门
- C语言快速入门 - Hello World 详解
- C语言快速入门 - 变量
- C语言快速入门 - 简单运算符
- C语言快速入门 - 控制语句
开始
上文我们讲了C语言的大致情况,以及编程的环境的搭建。而本文则着重讲解最基本的C语言程序 - Hello World。
程序
#include <stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
首先,我们来看下这个程序的核心printf。
观察一下printf
这个单词,我们可以发下,这个f
显得格格不入,这明显不是一个单词,所以我们把他分开来看,先百度下print的意思吧。
v. 在纸上印;打印;印刷;登载;刊登;发表
那么,我们可以把屏幕理解为一张纸,而printf就可以把括号里面的双引号里的内容打印到屏幕上来。
那么f
又是什么意思呢,它是format的缩写。format是格式化的意思,那么printf意思就是以一定的格式输出文字到屏幕上,具体是怎么样个格式化法,大家在学习变量的时候就会知道了。
同时,我们将输出的内容和这个双引号里面的内容对比,可以发现,还是有一点区别的。我们输出的是Hello World!
,而不是Hello World!\n
,也就是说\n
去哪里了呢?
如果大家了解过一点ASCII字符表(这里补充下什么是字符表:由于电脑内部储存信息的是二进制编码,而二进制和数字之间转换还是容易的,但是对于字母等符号,转就无法转换成二进制了,所以聪明的计算机科学家就想出了一个办法,将数字和字母对应起来,构成一张表,这样,电脑就能很方便的储存字符了。比如小写字母a
对应的就是数字97,大写字母A
则对应的是65。具体的还是希望点开那个蓝色的ASCII去看下百度百科里是怎么说的。)的话,应该知道,并不是所有字符都是可以看得到的,有些甚至还是起到控制的作用的。
而我们这里的\n
就是一个特殊的字符,它的作用便是换行。
我们可以试下,不加\n
会怎么样。
我们可以看到,编译运行后的结果是这样的,他没有换行,显得十分不美观。
\n
就显得十分美观了。\
开头,后面跟一个别的字字符,详见蓝字里的百度百科。
printf("Hello World!\n");
别忘了每句话的最后要加一个分号!!;
的作用就是用于区分每个语句的,所以我们打完一个语句就要用分号来告诉编译器,我们这句话结束了。
那么,为什么printf后面要加个括号呢,这里我们得引入函数的概念。
函数
我们都学过数学里的函数的概念,初中我们接触到的函数便是形如之类的,而到了高中,函数变了个样,但换汤不换药。那么,到了程序的世界里,函数就和后者很相似了。
本文不会很详细的介绍函数,但会将这个概念介绍给大家。
我们回到刚刚的那个printf
中,看下他的结构。
首先,用双引号括起来的是文本,他是一个整体:"Hello World"
,而剔除这部分,剩下来便是printf函数的主体了:printf()
。是不是和神似呢?
区别在于,我们所熟知的他的只能是个数字,而在程序里它可以是任何东西,而printf()
里的那个“”便是字符串(一堆字符的合集)。
那么,里的去了哪里呢,其实printf这个函数将我们的字符打印到屏幕上的这个功能便是对应的。
这么一说,大家是不是对函数有了初步的认识了呢?
除了printf()
,我们的程序中还有一个函数,那就是main
函数,关于它的更多信息,本文暂时不介绍(一开始就讲那么多关于函数的知识不利于理解)。
至于那个return 0;
,它和函数的关系也甚为密切,本文也暂时不讲。
然后我们来看下第一行#include <stdio.h>
。
我们还是先百度翻译下include的意思。
include
v. 包括;包含;使成为…的一部分
也就是说,这句话是想来让我们的C语言文件来包含一个东西,那这个东西自然就是我们后面跟上的<stdio.h>
,而stdio.h分明就是以stdio为名,类型是h的文件啊。
这里,我们将再引入一个概念:头文件。而这个stdio.h正是这个头文件。
什么是头文件呢?我们赶紧看看下文吧。
头文件
其实上来就说头文件不是特别好,但是提前讲这个的概念确实可以帮助大家对C语言有一个更加深入的理解。
首先,我们先对这个Hello World程序进行一定的修改,也就是把第一行去了:
int main()
{
printf("Hello World!\n");
}
然后我们在编译的时候就会爆出这么一串警告。
hello_world.c: In function ‘main’:
hello_world.c:3:2: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
printf("Hello World\n");
^~~~~~
hello_world.c:3:2: warning: incompatible implicit declaration of built-in function ‘printf’
hello_world.c:3:2: note: include ‘<stdio.h>’ or provide a declaration of ‘printf’
用中文来说,就是我们的编译器在尝试翻译我们的代码时,找不到printf是什么意思,他翻译不出来。
虽然说这个程序也是可以运行的,为什么呢,因为现在的编译器比较智能,它可以自动的在编译的时候帮你添加缺失的基本头文件,所以,你这样编译完之后的程序也能输出Hello World的。
那么为什么加了头文件编译器就能翻译成功了呢。
秘密,就在于头文件可以告诉编译器printf是什么,他能告诉编译器他能做什么,简单的,我们就可以把他理解为它是一张清单,里面列出了一些函数,可以教会编译器去怎么来翻译我们的C语言文件。
这就是头文件的作用。
那么,我们再回到那句#include <stdio.h>
吧。
现在,我们已经知道了,这句话的作用是教会编译器输出文字,而stdio.h相当于一本教科书,编译器能够看懂它。
我们再来谈谈为什么要在include之前加一个#
吧。
其实,这个#
可以帮助编译器区分预处理器指令和普通的代码,其实也就是说,以#
开头的代码叫做预处理器指令,是一种特殊的代码,为什么说它特殊呢?因为编译器首先看的就是以#
开头的代码,然后再看我们的主体代码的,他有着“优先权”。
再来,就是这本“教科书”的名字了——stdio.h
,.h
很好理解,一个文件的后缀,header的缩写,代表的他是一个头文件。而stdio
呢,我们再次开始我们的单词查询法(顺便提一下,计算机对英文要求很高,尤其是单词简写,要有一定的敏感性):首先std
是standard的简写,是标准的意思,而io
则是两个单词的缩写,分别是input和output,分别代表输入输出,所以stdio
便是标准输入输出的意思,它里面定义了一些输入和输出的函数,比如我们的printf
函数便是其中的标准输出函数之一。
那么,为什么是用<>
而不是用""
把stdio.h
括起来呢,这里也是有区别的。在操作系统(一般指(类)Unix系统)内部,有着固定的地方存放头文件,而<>
就是让C语言编译器去那个固定的地方读取头文件,而不是别的地方。
所以#include <stdio.h>
就是让C语言编译器去那个特定的地方读取我们的标准输入输出头文件。
那么至于#include "文件名"
呢,他则是从我们存.c
的源代码文件的同一目录读取头文件(因为我们自己也可以写头文件,本文暂时不介绍),并不是从特定的目录读取。
结语
读完本文,大家应该对一个基本的Hello World有了一定的概念了吧,下一篇文章我们将继续探究什么是变量:《C语言快速入门 - 变量》。