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。
进程:运行中的程序。