C语言——程序实现过程
一段代码要实现,会经过编译,汇编,链接,变成可执行程序,由我们用户使用 。程序的执行过程中有两个环境存在,一个是翻译程序环境,一个是执行代码环境,两个环境的不同就在于,先将代码翻译成我们的二进制文件供计算机阅读,然后计算机根据翻译的内容,执行相应的操作 。
程序的编译
程序的编译分为几个阶段,总结一下,就是将C代码转换成汇编代码,然后会进行代码的分析,就像语法分析,词法分析,语义分析,符号分析,而就是这几种分析,当我们编写程序的时候,遇见语法错误提示,便是编译阶段出了问题,在编译过程中,我们会将代码中注释部分去除,以便机器阅读效率更高 。
这里要特别了解一下**#在编译阶段,#定义的字符的值**会直接在代码中进行替换,然后定义的这行代码会被去除,使得代码简洁 。
而#可不止这一个功能,他不但可以定义字符,还可以用于定义宏,在计算结构体空间大小时,我们用到了一个函数这个函数在库函数中就是由宏定义的 。
#define OFFSETOF(struct,struct member)&((struct*)0)-struct member
宏是一种由#定义的,可以使用函数的功能,他在编译阶段会被识别然后进行替换 。
程序的汇编
进行完程序的编译就是程序的汇编,汇编的主要功能就是把汇编指令变成二进制指令,供机器识别 。
在这里我们可以打开vs编译器查看下面代码的反汇编 。
【C语言——程序实现过程】#includeint Add(int x,int y){int z=x+y;return z;}int main(){int a=1;int b=2;int ret=0;ret=Add(a,b);printf("%d",ret);return 0;}
打开反汇编方法
根据这个步骤,我们可以查看到该段代码的反汇编代码 。
可以发现,其中的一些还是可以识别的代码,这就是在汇编时,我们写的代码会转换成的二进制指令,供计算机阅读形成相应的符号表 。
程序的链接
在我们经常出现的错误未找到定义的函数时,就是程序的链接出现了错误,俗称链接错误,在链接时,程序会合并段表,主要会发生符号表定义和重定位 。经过链接才会生成可执行文件,也就是产生*.exe文件 。存在我们的Debug文件夹中 。
#的大用处
在简述程序的实现过程就免不了会看见#,这个符号的用处不光是在头文件和有关系,还跟打印有关,当我们在屏幕上打印东西的时候不可避免是会使用函数,在使用该函数打印字符串时,两个相邻被引用的字符串可以相互连接 。
#includeint main(){printf("hello" "world");return 0;}
可见当我们隔开字符时,字符打印时会自动连接,而我们的#是如何使用的 。
在我们打印个人信息时,经常会需要多行代码分开打印,而#可以代替变量的存在,减少代码冗余 。
#include#define PRINT(value,format) printf(#value"的值为"format"\n",value)int main(){int a = 1;PRINT(a, "%d");float b = 2.0f;PRINT(b, "%lf");return 0;}
这个宏既可以打印整型也可以打印浮点型,就是利用的#可以将后面跟随的值变成字符串,所以在打印时也可以输出,因为字符串和字符串之间可以相互连接 。
##(双#号)
这个符号的作用有点奇葩!!!
是将左右两边的字符串相结合,然后变成一个新的字符串,但前提是这个字符串被定义,否则会被判定不合法!
#include#define PACKBAG(num,value) num##valueint main(){int cat = 10;int mouse = 10;int catmouse = 20;printf("%d",PACKBAG(cat,mouse));return 0;}
- 贪心算法与数据结构结合2——最小生成树问题:Prim算法
- php金钱换算函数,用php语法和函数完成分钱转换成元角分格式程序?
- ZIP伪加密与音频拨号隐写 —— 【高校战“疫”】隐藏的信息
- 面对10亿小程序流量,餐饮商家如何打破运营僵局?
- 一 基础元件学习——电阻元件知识
- 微信小程序下拉菜单实例
- 最值得普通人学的编程语言是哪个?
- 微信小程序下拉菜单组件实现
- 微信小程序CSS3动画下拉菜单
- 微信小程序中 Vant DropdownMenu 下拉菜单组件穿透问题