#include <stdio.h>
int main()
{
int n = 1;
n = 10;
printf("%d", n);
return 0;
}
运行结果:10
简单解读:
#include <stdio.h>
int main()
{
int n = 1;
//int是变量声明,告诉编译器n这个变量占4个字节,且是整数
//1是n的初始化值,表示n以1这个值存进内存单元中
n = 10;
//将内存单元中n的值改为10
printf("%d", n);
//输出n的值
}
这里先来了解机器的运行原理,机器不像我们人或者动物可以去认识万事万物,机器只认识简单的二进制数字,0和1,也就是正负脉冲,那么机器只认识0和1,又是怎样来运行这么多复杂的代码的呢?这就体现了人类的智慧,人类把万事万物都编排成二进制代码,这样机器就可以识别运行了。无论是我们输入的数字,字符串还是英文,都会被编译器翻译成二进制0和1的数字,然后再交给机器运行,这就是机器的运行原理。
在上个程序中n的类型是int,这时候机器就知道在内存中开辟出4个字节并且给此地址贴上整形的标签。将n初始化为1;此时机器(比如32位机器)会把0000 0000 0000 0000 0000 0001存到这个内存中,后来再将10赋给n,机器会把10的二进制代码0000 0000 0000 0000 0000 1010存到开辟给n的地址中,之前存的1会被销毁。1的作用仅仅是用来给n开辟空间,是多少都无所谓,你可以给n初始化成2,9,100等等都可以。
1.什么是程序?
首先,程序的本质就是一连串能被CPU识别并执行的有0、1代码组成的指令即目标代码。不同类型的CPU指令集不同,相同一段0、1代码inter CPU能识别,ARM CPU可能就识别不了。
其次,程序的运行原理,程序是运行在操作系统上的,但想要再操作系统上运行就要在程序头部嵌入一段启动代码,此代码相当于程序和操作系统之间的接口,它包含操作系统所需要加载的信息。如果没有这段启动代码程序很难在windows,linux等操作系统上作为一个普通程序运行。
综上,程序=目标代码+启动代码。目标代码是系统本身自带的。
系统平台是值CPU+操作系统的组合。如inter CPU + windows XP、 interCPU +Mac OsX等。
2.什么是编译器?
编译器,也叫做软件,总的来说,就是能将代码转化为二进制指令的工具,可以提高编程效率与质量的工具。
编译器的任务是把高级语言程序翻译成计算机能理解的机器语言指令的程序。机器语言也就是由0和1组成的二进制序列。
另一个任务是催动链接器来链接库函数与源代码生成可执行程序,此外编译器还会检查C语言程序是否有效。
不同CPU制造商使用的指令系统和编码格式不同,使用合适的编译器或编译器集,可以把一种高级语言程序转化为供各类不同类型CPU使用的机器语言程序。
总结来说一句话,编译器是将源代码转化为可执行代码的程序。
3.语言编译过程。
一般,我们使用的文本编译器,编写的代码文件就是源文件,但要注意的是,我们编译的代码是不能被机器识别的,机器智能识别由0和1组成的机器语言。
所以我们需要某种转化媒介将我们写的英文代码转化为机器可以识别的数字代码。此时编译器就是这种交换媒介,实现了这种交换。编译器将源文件转换为机器语言转换的代码,这种代码叫做中间代码。
中间代码再通过链接器合并已经编译的模块,生成可执行文件。中间代码是放在目标文件中的,目标文件中的代码是机器语言,并不能执行,它是不完整的程序,此时通过链接器与启动代码和库文件中特定代码结合生成可执行文件,才是机器可以执行的代码。
其中启动代码充当程序和操作系统之间的接口。
总结来说,我们在文本编译器上写出源代码(英文),通过编译器——>中间代码——>放在目标文件中(机器语言,但不完整),通过链接器,加上启动代码,库函数代码——>可执行文件——>机器可以运行
源代码文件:如wordcount.c
目标代码文件:如concrete.obj
可执行代码文件:如concrete.exe
文件名 | 内容 | 机器 | 运行 | 组成 |
源文件 | 文字 | 不可识别 | × | 文字 |
目标文件 | 纯数字 | 可识别 | × | 数 |
可执行文件 | 纯数字 | 可识别 | √ | 启动+目的代码 |