1.1 C语言 2022.8.22日

本文探讨了C语言在高级语言中的运行效率,强调其在LINUX等基础设施中的核心地位。C语言影响了众多编程语言,以其简洁、接近底层的特性著称。通过预处理、编译、汇编和链接四个步骤生成程序,主要涉及内存布局、调试技巧(如断点使用)及宏定义的注意事项。同时,文章提及进程的内存空间结构和程序状态码的重要性。
摘要由CSDN通过智能技术生成

C语言在高级语言中,运行速度是最快的。

当今的网络世界是建立在C语言之上的。LINUX等基础设施,基本都离不开C语言。

C语言影响了后来大多数的编程语言。

TIOBE指数

简答易学,贴近计算机底层。

C语言是UNIX的副产品。起源于ALGO 60,B语言。

C语言可以用来操作硬件,且性能很高,因为最初是用来编写操作系统的,因此,有了这样的特性。不会提供影响系统性能的特性,如检查数组是否越界。没有异常捕获机制(try catch)。

C语言和汇编语言有很强的对应关系。

解决方案管理多个项目。

项目包括:头文件、源文件、资源文件(文本、视频、配置文件等)。 这些文件仅仅是窗口,方便程序员进行分类,实际都存储在同一个文件夹中。

main函数是程序的入口,操作系统运行程序时,会调用main函数来执行程序。

main函数的返回值有什么用?谁会接收这个返回值。

这是程序的状态码,表示程序处于终止状态。

0表示程序正常结束,如果是非0,表示程序异常结束。

操作系统接收这个返回值。

程序的主要工作不是编写程序,而是调试程序。

调试程序的关键是打断点。

大小端表示法。小端:低有效位 存放在低地址。

计算机寻址的最小单位是字节。

真值和机器数是通过编码和解码关联起来的。

真值:如255、'A'

机器数:数字在计算机中的二进制表示。

内存布局和机器数是通过大小端表示法 关联起来的。

调试界面绿色箭头所指向的代码行 还未执行。

F5启动调试,F10逐过程(比如遇到for循环,执行完for整个过程,比如运行完main函数中调用的整个函数),F11逐语句(一条语句,一条语句的执行)。

继续则是运行到逻辑上的下一个断点,如果没有断点,则会运行完整个程序。???啥意思

带参数的宏 也可以称为宏函数

#define foo(x) x+x*1  有时候 会导致不可预知的错误,因为仅仅是机械的文本替换

左括号应该紧贴函数名 若有空格 则会将foo替换为后面的东西

用括号将宏函数括起来 能避免不可预知的错误

如果调用foo(1+2)  调用时 会替换为 1+2+1+2*1 仍会得到不可预料的结果 如果定义中写(x) 则能避免此问题

若使用++x作为参数 则有可能自增多次  因此,不要在宏函数中传入此类参数。

宏函数的好处是什么?因为运行时效率高,省去函数调用时的额外开销。

宏函数如果一行写不下 可以写为 并且每行后加\

#define SWAP { \

  语句; \...  

}

程序是如何生成的

有时候,也会将前三步,统称为编译,得根据题目具体理解。

预处理:先将头文件中的代码copy到源文件中,对宏进行文本替换,生成.i文件。

编译:编译器将高级语言翻译为汇编代码,生成.s文件。

汇编:将汇编代码翻译为对应平台的机器代码,生成.o文件,又名目标代码。

链接:将程序所需要的其他附加代码,如库文件和.o文件,以及操作系统的引导代码链接起来,生成可执行程序。

链接的主要内容就是把各个模块之间相互引用的部分处理好,使各个模块可以正确的拼接。

链接的主要过程包块 地址和空间的分配(Address and Storage Allocation)、符号决议(Symbol Resolution)和重定位(Relocation)等步骤。

stdio.h 是头文件,只起描述性作用,用于告诉用户如何调用相关函数或变量。而链接器会从库中寻找相应的实际定义代码,比如 printf.o。

进程:运行中的程序。

进程的虚拟内存空间:代码段、数据段、栈区、堆区、操作系统内核。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值