一.前言
一切,都想从不一样做起。大学,原以为会和我当时高中想象的那样,可以谈场轰轰烈烈的恋爱,可以自由自在的旅行,可以忘乎所以,尽己之所兴。如今,大三结束。蓦然回首,却发现自己浪费了那么多改变自己的机会。如今,大学只剩最后一年,我要用这最后的时间去弥补曾经所浪费的一切,从现在开始,朝着自己的目标勇敢向前。
大学期间,最爱逛图书馆,经常走到人工智能的专业书前,说起来,自己报自动化这个专业也是由于当时很渴望能够在未来同智能机器人打交道。那既然如此,就好好朝着自己的梦走下去吧,上网查了资料,说到嵌入式是控制人工智能的必要方式,但第一步肯定要学好c语言,想当初大一时c的教学就那么匆匆掠过,心中后悔自己没有自学。不过也不迟,我是个从来不喜欢服输怕迟的人,很喜欢一句话,活到老,学到老。更是相信,一切皆有可能。那从今天开始,我要重新认真学好c语言。而在这,我使用linux来编辑学习c
二.C语言基本内容
C的历史,说真的,很佩服前辈们怎么能如此聪慧。是有怎样的大能才能使得那繁琐枯燥的0,1两个数字演化成如今接近我们语言的C。谈到c,都知道c程序
那么什么是程序呢?它又有些什么作用?
程序笼统的来说,就是为了实现一个特定的目的而设计的一系列有序且可操作的指令步骤。它一开始存储在磁盘上,当需要用到时,将会被读取到内存中,通过寄存器从内存中转接给cpu处理之后,又返回给内存。通过这样的步骤以实现我们所需要它完成的动作。
三.C语言的基本形式
但是,对于计算机而言,它只能识别0,1这两个数字,因此,当我们编写完程序之后,要通过计算机程序的转换,也就是常说的编译、链接将它转换成计算机所认识的机器语言。
c也有它特定的数据类型和表达形式。看到别人写c基本都是从这个形式开始。
#include
Int main ()
{
...
Return 0;
}
#include<>用于包含c语言的头文件,它会将它后面所包含的文件在预处理期间,把文件原来的内容替换到当前的位置。而在头文件里,有一点值得注意include 后面的<>有时候还可以用””但是,它们却有着不同的用法。
1.使用<>包含头文件时,程序会去系统默认的头文件存放目录下找<>包含起来的文件(系统默认的存放目录一般是/usr/include文件夹内)。
2.使用””包含文件时,首先会在我们所创建的程序所在的目录下查找头文件,如果找不到,再去系统目录下找。
Int main ()这是函数的定义形式,main是一个函数,这个东西运行结束,就要往外抛出一个值,int正是代表要抛出的值的类型。main函数是c语言程序的入口函数,所有的c语言的程序都是从main开始执行的,在一个程序里,有且只有一个main函数。
“{ }”内的语句叫块语句,函数所有的代码都要在大括号之内。在{ }内定义的变量叫做局部变量,外部定义的变量叫全局变量。
“printf”是一个函数,它的功能是往标准输出打印数据,有着一些固定的格式,我们用双引号将字符串括起来,而printf是可以直接打印字符串的。而printf作为一个函数,就一定要声明,是的,它的声明语句就在我们刚才所说的stdio.h的头文件里,所以当你要使用printf时,就必须要包含stdio.h头文件。当然,如果你整个程序里都不需要用到stdio.h头文件里的函数,你当然可以在开头声明时不用stdio.h这个头文件。另外需要注意一点,c语言里的语句都是以分号;结束。所以在写完一句代码需要转到下一行之前,千万别忘记了这一点,不然一定会报错。正所谓失之毫厘,谬之千里。所以一定要细心。写完一段代码,要认真检查,看看自己是否有什么遗漏。
最后的return代表着一个函数运行的结束,一旦扫描到它,在它后面的语句都不会再执行。它后面所跟的0就是一开始我们所说的程序结束所要抛出的那个值。记住,这个值的类型一定要更函数定义时的类型一致哦。
四.C程序的运行
当我们写好一段程序之后,并不是代表我们的工作已经结束了,我们还要对这个文件(我们一般将这个文件叫做执行文件)进行四步走的计划,也就是预编译,编译,汇编和链接这四个步骤,最终它才能形成计算机能够运行的可执行文件。
1.预编译
顾名思义,预编译就是在编译之前的一些处理。预编译的主要作用是在编译之前处理由“#”开头的命令#include做文件替换,因为对于一些头文件,并不是我们写的,它是在文件库中被我们调用来使用的,在做预编译时,它会将我们调用的这个头文件的整个源代码都替换到我们所编写的程序中,也就是将头文件的名字换成实打实的内容。同时它会在里面去掉我们在一开始在程序里所做的一些注释等。
在linux里,我们预编译的命令是:gcc-E 源文件 -o 生成的预编译文件(xxx.i)
2.编译
编译的作用是把我们通过预编译生成时的预编译文件(xxx.i)文件编译成汇编文件。因为c语言的进化史,是由机器语言发展到汇编语言,然后到高级语言的,但是计算机只能识别机器语言,所以,我们还要反着回去,由高级语言编译到汇编语言最后到机器语言。这样才能被计算机识别并执行。
编译的命令是:gcc -s源文件 -o 汇编文件(xxx.s)
3.汇编
汇编的作用是将代码编译成二进制,也就是翻译成机器语言。
汇编的命令:gcc -c 汇编文件(xxx.o)
4.链接
链接的作用是将当前的目标文件和其他使用到的库文件整合到一起生成可执行的二进制文件,因为,系统所包含的头文件并不一定拥有所有我们所需要的头文件,这时候有些大牛会做好了这些文件,你可以直接拿来使用,比如,你需要使用math.h这个头文件,但是你在linux的/usr/include里是找不到这个头文件的,但是大神们已经帮我们写好了,此时,我们要使用它,只需要在我们的命令最后加一个“-lm”就可以。“m”就是math.h的缩写。
肯定的,如果按照这四步走,我们一步一步的编写这命令,肯定要烦死。所以,我们有命令将这四步直接走一遍。你可以直接:gcc 源文件,此时生成的是可执行的a.out文件,当然如果在一个文件里你有许多源文件要编译,此时生成那么多a.out肯定会搞不清,所以,我们还可以使用这个命令来让它生成的可执行文件改名:gcc 源文件 -o 生成的可执行文件名。这样就可以有所区分,当然最好的是取生成的可执行文件名的时候不要给它加后缀。
最后,说说如何运行这个可执行文件。在可生成的可执行文件前加“./”就可以,整体的形式是“./可执行文件”。这里需要注意一点,”./”并不是一个命令,他只是一个路径而已,如果你知道可执行文件的全部路径,你也可以“路径/可执行文件”也是可以运行文件的。好了,这次就写到这,我要去练习一下今天所学习的内容了,毕竟缺少实战可是不能学的完整的。