条件编译
1.概念:是一个根据条件编译代码的预处理指令
2.作用:可以让一段代码只在满足条件才编译,提高编译效率
3.用法:
通用 #if 条件表达式 #elif 条件表达式 #else
与宏定义相关 #ifdef 宏名 (表示定义了宏) #ifndef 宏名 (表示没有定义宏)
#endif 结束条件编译(必须有)
4.特点:①条件编译不能访问需要编译后才能执行的代码
②条件编译不需要用大括号,所以必须加上结束表示,否则涵盖下面所有代码
③条件编译一般跟宏定义配合使用,防止重复包含及交叉包含
条件编译对定义变量没有作用,只对预处理指令起作用
#endif只对离其最近的#if起作用
关键字-typedef
1.作用:给一个数据类型取一个别名,方便使用
2.用法:
定义:typedef 类型 别名
如:typedef long int Lint 表示给以个long int类型取一个别名为Lint
则:long int a= 5; 与 Lint a=5 二者等效
3.特点:①定义位置没有限制,函数内外都可以
②作用域为定义位置开始至所处作用域结束,类似于变量
③可以用于任意数据类型
④别名具有数据类型的含义,这是跟宏定义最大的区别
宏定义可以实现一些typedef的功能,但是不能完全替换,因为typedef本身具有类型的含义,这时二者最大的区别(定义指针类型的时候,#defined定义的不能连续定义,typedef可以)
static和extern:控制一个变量或函数的作用域
1.外部函数(extern):定义的函数能被本文件和其他文件访问,默认情况下所有的函数都是外部函数,且不允许有同名的外部函数
内部函数(static):前面加了static,定义的函数只能被本文件访问,表示这个函数只能被本文件访问,别的文件就算声明了也不能访问
2.全局变量:
外部的全局变量(extern):表示可以被其他文件访问操作,默认情况下,所有的全局变量都是外部变量,不同文件中的同名外部边明亮,都代表着同一变量
内部的全局变量(static):表示当前这个全局变量只能被本文件访问,外面文件无法操作它的值。局部
变量一旦被static修饰,那么它只会在函数执行第一次时候创建。
如果函数再次执行,其将会复用之前创建的变量,同时这个变量的声明周期直到程序结束
3.特点:①外部函数不同文件中也不能重名,但内部函数可以
②同类型全局变量可以重复定义,但在内存中只有一份
③可以在函数内声明一个全局变量,弹药使用必须在函数外定义,extern只是声明
④static修饰定义局部变量,则这个局部变量生命周期延长至程序结束,但作用域不变
auto与canst
1.auto:用于定义一个能自动回收的临时变量,这个变量在作用域内用完后会自动销毁
canst:用于定义一个常量,这个常量在常量区,且在内存中仅有一份,且不能改变
2.用法:
auto 数据类型 变量名(默认所有局部变量都是被这个修饰,可以省略) 如:auto int a=0-->int a=0
注意:①static修饰的除外2全局变量除外
canst 数据类型 变量名=值
注意:一旦定义,值就固定不能被改变 如:canst int a; a=0 错误
goto
1.让指令能够不受条件跨越执行,简化代码
2.用法:
register与volatile
1.作用:
register表示让程序优先把这个数据存在寄存器中
volatile表示让编译器不要去优化代码,不能用缓存,每次使用都必须去内存中获取
2.用法:修饰变量
register 数据类型 变量名;
volatile 数据类型 变量名;
3.什么时候用?
register:如果一个变量使用相当频繁且占用内存又不是很大,可以使用,全局变量与加了static局部变量除外
volatile:如果需要让计算机严格按写得指令执行,且能关注变量每一次值的变化,这个时候可以使用,则编译器不会对执行指令作优化
递归
1.概念:指在函数的定义中使用函数自身的方法,即函数自己调用自己
2.作用:实现一些反复执行的操作
3.用法: 让任意一个整数倒序累加至0的值,如:为3时:3+2+1+0;
int add(int a)
{
if(a==0) return 0;
return a+add(a-1);
}
4.什么时候用? 当有一些反复的操作,但没有告知明确次数的时候
5.特点:可以用循环实现递归的所有操作
文件操作
1.概念:是对文件或文件内容的输入(读)与输出(写),文件操作的函数在<stdio.h>声明中
2.用法:①打开一个文件并确定操作的方式:fopen(“文件”,“打开方式”);
函数会返回一个文件的指针(即结构体的指针).FILE *
|
|