1.初学C语言(day1)

一、初学C语言

(1)C语言与汇编语言的关系?

程序员编写的C语言代码,首先要经过C语言编译器,生成汇编代码,这个过程称为编译阶断,当C语言编译器生成汇编代码后,再调用汇编器来将汇编代码编译成汇编指令。
这是一种站在巨人肩人的作法,最早的C++编程语言也是这样的实现方法,只不过那时候叫Cfront程序,Cfront程序的作用是将C++代码转换成C语言代码,类似于一个文本处理器,然后再调用C语言编译器,将C源码编译成汇编代码,然后再调用汇编器将汇编代码编译成机器码。
这个过程,在Windows平台上不容易操作,但是在Linux平台上很容易看到。以gcc这款c语言编译器为例,它实际上是四个小程序。
cp: c语言预处理程序,有它负责进行预处理操作。
cc: C语言编译器,它负责将C源码编译成汇编代码。
as: 汇编器,它负责将汇编代码编译成机器码,一般使用gcc test.c这样的命令编译C语言时,会生成一个a.out的程序,它实际上指的就是as ouput,即汇编器输出文件。
link: 链接器,它负责将汇编器输入的机器码和库打包成一个操作系统可以运行的可执行文件,在Linux上的可执行文件格式是ELF格式,这个格式的实现是有链接器来完成的。

过程:预处理操作——将C源码编译成汇编代码——使用汇编器将汇编代码编译成机器码——链接器

(2)对于不同的CPU它的机器指令是不同的?对于不同的CPU它的汇编语言也不同?

各计算机公司设计生产的计算机,其指令的数量与功能、指令格式、寻址方式、数据格式都有差别,即使是一些常用的基本指令,如算术逻辑运算指令、转移指令等也是各不相同的。因此,尽管各种型号计算机的高级语言基本相同,但将高级语言程序(例如Fortran语言程序)编译成机器语言后,其差别也是很大的。因此将用机器语言表示的程序移植到其他机器上去几乎是不可能的。**总结:不同的CPU,肯定是具有不同机器语言。**,所以出现了**汇编语言**:汇编语言都和CPU的设计结构一致,和机器码一一对应,不同的CPU结构千差万别,同一个厂商不同阶段或系列的CPU使用的汇编都有所不同,不同位数的CPU的汇编是不同的。32位的X86汇编和32位的SPARC V8的汇编就不一样,后者是精简指令系统(RISC)的,前者是CISC的。不过基本东西是一样的,如寻址、基本指令(指令拼写可能不同)。**总结:也就是不同的机器都对应一套自己的汇编语言。**,所以出现了**高级语言**,可以将高级语言代码通过:解释器/编译器将高级语言编写的程序转化成机器指令,,然后再运行。(所以对于不同的机器能够转化成不同的机器指令,所以用高级语言编写的程序,只要编写一次,就可以在任意的机器上运行了。)

(3)main()函数

就是我们在电脑上执行编译以后的程序的时候,操作系统会调用入口函数(main()函数),在执行的同时,也可以向程序传递一些数据(变量)

(4)return 关键字

作用:return语句表示从函数中返回、结束函数的执行

(5)代码示例:

int mian()
{
	return 0;
}

// “int main()”表示返回一个整数。(main函数返回0给操作系统,表示没有错误,如果返回非0,表示某种错误)

(6)printf 函数
C语言(标准库)提供了一个printf函数,用来在屏幕上打印输出信息。

#include 
int main
{
	printf("hello world");
	return 0;
}

// 因为标准输入输出头文件"stdio.h"中声明了printf函数,因此必须用预处理“#include”将该文件包含起来。
//预处理器(当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。预处理也叫预编译,编译器包含欲编译器/欲处理器):对源代码中的预处理指令进行处理,得到新的源代码。
过程:包含预处理指令的源代码——通过预处理器——转化成“无预处理指令的源代码”——通过编译器/解释器——转化成机器指令代码(01010101)

C语言中的三种预处理:

在集成开发环境中,编译,链接是同时完成的。其实,C语言编译器在对源代码编译之前,还需要进一步的处理:预编译。预编译的主要作用如下:
1、将源文件中以”include”格式包含的文件复制到编译的源文件中。
2、用实际值替换用“#define”定义的字符串。
3、根据“#if”后面的条件决定需要编译的代码。

你可能感兴趣的:(C语言的学习)