ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

log[10]:C语言基础——函数与预处理命令

log[10]:C语言基础——函数与预处理命令 一、标识符的作用域与可见性问题标识符变量名函数名数组名作用域发挥作用的区域C语言中一个{ }代表一个作用域。局部作用域只要在{ }范围内都是局部作用域局部定义域定义的变量是局部变量全局作用域不在任意一个{ }内是全局作用域全局定义域定义的变量是全局变量例int a10; int main(void) { int a20; { int a 30; printf(a1 %d,a); } printf(a2 %d,a); }输出a130a220可见性站在程序的角度看程序运行到某一刻时哪些标识符可见。规则1.先定义后使用2.同一作用域中不能有同名标识符3.在不同的作用域同名标识符相互之间没有影响4.如果是不同的作用域但是作用域之间存在嵌套关系则内层的作用域的同名标识符会屏蔽外层的作用域的同名标识符。 (就近原则)二、存储类别关键字C语言五个区栈堆全局区字符常量区代码区可以指定关键字表示数据放在哪里auto int a 10;表示变量开在栈上默认开在栈上一般不写static int a 0;表示开在静态区特点1、只需要初始化一次2、不能用变量初始化3、静态局部变量的值具有继承性从变量角度时间上看变量是有生命周期的局部变量的生命周期从定义处开始至所用作用域结束。 定义---作用域结束全局静态变量的生命周期从程序运行开始就存在直到整个程序结束才销毁。register int a 0;计算机存储体系 寄存器、cache、内存、硬盘从上到下容量越来越大价格越来越便宜速度越来越慢register——寄存器告诉编译器将a存在寄存器中。建议性关键字如果是register修饰的变量不能做取地址运算。因为内存空间寄存器取不了。extern int a表示变量存储在别的文件中要使用时去别的文件查找。起声明作用。extern和staticstatic也可修饰全局变量表示将该变量的作用域限定为本文件别的文件中无法引用extern相当于限定了作用域extern相当于扩展了作用域static也可以修饰函数——多文件编程作用和修饰全局变量作用相同函数完预处理命令所有预处理命令都以#开头是编译系统的一部分不属于C语言。代码实际编译过程预处理将程序中的预处理命令执行完将代码处理成纯的C语言代码编译将预处理完的文件进行语法、词法分析检查问题生成一份汇编代码汇编将前面的汇编代码最终翻译成机器代码链接将用到的第三方代码链接成为最终的可执行程序宏定义#define 标识符 字符串 宏名 宏值#define N 10作用用宏名代替一串文本信息注意宏名本质还是一个标识符宏名建议大写宏名——符号常量用一个符号代替常量值宏工作的本质——文本替换但是代码中出现在 “ ” 中的宏名不会被替换所有宏定义是以换行符为结束符的好处可以一改全改提高代码可读性带参宏#define 宏名参数表 宏值可以给一些参数形式上特别像函数调用带参宏和函数有本质的区别1、函数的参数带类型——带参宏没有类型就是文本2、函数程序运行之后才可以用——带参宏在预处理阶段就处理完了例两数相乘函数int Sum(int a,int b) { return a*b; }带参宏#define MUL(a,b) a*b带参宏是一一对应的编译过程中文本替换。带参宏副作用可能会改变运算结构建议可能会改变的加#define MUL(a*b) ((a)*(b))例MUL(12,34)会被编译成 12*34最终结果为11而不是3*721。宏的作用域从定义处开始往下都起作用#undef取消定义可以控制作用域范围
返回列表