|
用机器码编程就像用牙签吃东西,刺的块很小且做起来很费力,吃一顿饭要花很长时间。同样,每个机器码字节只是完成可以想像得到的最小且最简单的计算工作—从内存装入一个数至处理器,与把它另一个数相加,再把结果存回到内存—所以,很难想像机器码如何完成一整项的工作。 ——《编码的奥秘》
当计算机刚刚问世的时候,程序员们都是在打孔的纸带上书写程序,他们试图用计算机可以看明白的机器语言(二进制指令)与计算机进行亲密的交流。然后不久之后,程序员们发现这样做效率实在是太低下了!!于是,他们经过不懈的努力(头秃)终于发明了高级语言用来方便程序员与计算机打交道。
所谓高级语言,就是”程序员友好向语言“。高级语言中许多语句语法和英文极其类似,人类只要经过一定的训练,利用其编码是非常轻松的。为了让计算机能够理解高级语言,程序员们还额外编写了专门翻译的软件“编译器”用来协助计算机理解执行你写的代码。对于初学C语言的读者们而言,你们不需要理会计算机如何识别你写的代码。学会如何编写C语言是你们的首要任务。
世界上最简单的程序是什么?那必然是“Hello world”,能够在屏幕上输出“Hello world”意味着你正式的踏入了计算机的世界。
一段“Hello world”C代码长下面这个样子。
#include <stdio.h>
int main()
{
printf(&#34;Hello, World! \n&#34;);
return 0;
}这个程序做的事情很简单,在屏幕上输出一行英文“Hello, World!”。
你们刚看到这个程序的时候,大概只认识几个英文单词,如“main”是主要的,”print“是打印,以及一对引号扩起来的Hello, World!。不要急,接下来我们一行一行慢慢解释。
首先,看第一行。
#include <stdio.h>这个叫做预处理指令,它的作用是把stdio.h这个文件里面的内容放进我们写的这个c语言文件里。那么你会说,这一行代码是如何把这个内容放进来,并且为什么要包含进来呢?先别急,我们先来了解几个概念。
首先,我们引入函数的概念,什么是函数呢?在数学中函数是定义域到值域的映射,如果我们将定义域看成输入,值域看成输入。那么一个函数可以看作在完成一组特定的动作。而C语言中的函数正是用来完成特定任务的。例如上述代码有如下结构:
int main()
{
}上面这个东西就叫做一个函数,这里的int是函数的返回值类型,后面会提及。main是这个函数的名字,正如所有人都有自己的名字一样。紧接着main的一对小括号表示了函数的输入,这里我们按下不表。大括号内的内容就是整个main函数所要做的任务。
在C语言的语法中,每个程序必须至少包含一个main函数。每一段程序都有一个主要的任务,因此必须有一个程序的入口。在执行程序的时候,程序会从main函数开始执行,并且会随main函数结束而终止程序的执行。对于上面那个main函数,用中括号“{ }”括起来的部分叫做函数体,这里的main叫做函数名。
但是如果我们要完成某个很复杂的任务的话,只使用一个main函数就会让这个函数很复杂冗余,所以我们就可以将复杂的任务分解成几个。
如果我们把函数看成一种工具,比如我要做一个菜,就需要锅、菜刀、煤气等等。我要完成的任务就是“做一个菜”,我们拥有的函数就是“锅”、“菜刀”、“煤气”。那么“我”就是main函数,用来操控其他函数。菜刀这个函数的作用是“切菜”,煤气这个函数的作用是“加热”,锅的作用是”盛菜“,那么我利用菜刀切菜的过程,叫做函数调用。
这样,如果把做菜的过程写成代码,就会像下面这样:
我()
{
菜刀()
锅()
煤气()
}我通过上面这个过程,做了一盘菜。
回到之前的“Hello World!”程序,刚刚说到了预处理指令。我们为什么要把stdio.h的内容加入到我的代码里呢?注意看,我们的代码里面调用了一个函数printf(这个printf就是函数名),这个函数的内容就包含在stdio.h内。这个函数属于库函数,是操作系统帮助我们完成一些基本的输入输出任务的函数,已经被发明C语言的大佬写好放在了标准库中了,所以我们直接进行函数调用即可。为什么不能直接调用printf?因为我们在用”锅“之前,肯定要知道锅在哪里吧?所以,在调用函数之前,必须要让计算机知道这个函数的存在。
好的,我们已经了解了预处理指令,下面多说几句关于函数的知识。之前我们提到过int是函数的返回值类型。那么什么是类型?什么是返回值呢?
我们日常生活中用到的0、1、2、3叫做自然数或者整数,而120.123是小数,1/3是分数,这些都是这些数字的类型。那么对于c语言的数据而言也有类型。比如0,-1,2323423都是int型,即“整形”。相应地,120.123叫做浮点型等。
返回值是函数的输出,我们完成一个任务可以得到一个结果,我们可以把结果返回给调用它的函数。我们以下面的函数为例,来完整理解一下函数的返回值。
int sum(int a, int b){
return a + b;
}这个函数名叫做sum ,返回值类型是int型,而小括号里面的东西,叫做函数的参数。参数就是函数体内会用到的数据!当然,像main函数不需要参数,那么小括号里面什么都不写
解读一下就是:我们实现了一个函数,它的作用是用来计算两个整形数(a和b)的和,然后把它们的和返回给调用者。
怎么使用呢?
#include<stdio.h>
int sum(int a, int b){
return a + b;
}
int main(){
int a = 1;
int b = 2;
int res = sum(a, b);
printf(&#34;a + b = %d\n&#34;, res);
return 0;
}通过上面这段代码,main函数调用了sum函数,把a,b作为参数传递给sum函数,然后sum函数计算出a与b的和,把这个和返回给res。那么这时res的值就是a+b了,下面通过printf函数来把a和b的值输出。(printf函数具体如何使用我们后面的文章会讲到)代码执行的结果最终如下:
a + b = 3学到这里,我们可以对最上面的helloworld程序有一个完整的解释。
我们通过main函数来完成一个任务:输出helloworld。main函数是一个不需要参数的函数,返回值类型是int(所以后面会return 0,实际上返回给操作系统,告诉操作系统我完成了任务。)这里再插一句:返回值可能传递给调用它的函数,也可能传递给操作系统(只有main),对于计算a+b的程序,sum的返回值会传递给调用它的main函数,而main会传递给操作系统。
总结:一个“Hello World”程序会从main函数开始执行,main函数调用c语言标准库里面的库函数printf,来完成这个输出的任务,结束后,返回0,告诉操作系统:我完成了任务。
这是通俗入门C语言教程的第一篇文章,关注公众号&#34;图灵驿栈&#34;。后续会更新更多计算机学习的相关内容。 |
|