作用域和预处理
1.作用域
作用域变量可使用的范围
-
块作用域
块级作用域就是使用一对大括号包裹的一段代码;
代码块内部定义的变量在代码块外部是访问不到的,并且等该代码块中的代码执行完成之后,代码块中定义的变量会被销毁。
{ int a; //a的作用域起始处 scanf("%d", &a); if(a < 0){ //b的作用域起始处 int b; b -= a; } //b的作用域结束处 } //a的作用域结束处
-
函数作用域
调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
每调用一次,函数就会创建一个新的函数作用域,它们之间是互相独立的
在函数作用域中,可以访问到全局作用域的变量
在函数内部定义的一些变量,只能在函数内部使用。一旦离开了这个函数,就必须重新定义。可以把函数想成一个块。然后套用块作用域的定义。
void add(int a,int b)//进入函数sum的作用域开始,申请内存空间 { int sum=a+b; return sum; }//出函数作用域结束,释放内存空间
-
文件作用域
-
全局作用域
全局变量的作用域,在整个工程中都可以使用的
全局变量如果不初始化,默认的值为0
全局变量多文件操作是,需要向前声明加 extern
//推荐: //声明时: extern int g_nNumber; //定义时: int g_nNumber;
2.生命周期
生命周期就是指变量什么时候申请内存空间,什么时候释放内存空间
- 局部变量
- 进入函数生命周期开始, 申请内存空间
- ,退出函数生命周期结束,释放空间
- 全局变量
- 程序运行, 申请内存空间
- 程序结束, 释放内存空间
注意事项:
- 同作用域不可以定义同名作用域
- 不同作用域可以定义同名作用域
- 作用域范围小,屏蔽外部大的同名作用域
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 1;
{
int a = 2;
printf("a=%d\n", a);//作用域范围小,屏蔽外部大的同名作用域
}
printf("a=%d", a);//上面第二个a=2,作用域是块,出了块作用域结束,释放了
return 0;
}
预处理
1.包含#include
- 常见的#include包含,系统库函数,头文件的包含
- 分文件编写时, 头文件写声明,源文件写定义,
- .h文件 被 .c文件包含后,就是把.h 里面所有的代码复制到 .c里面
- 避免在头文件定义变量,防止头文件多次包含,导致文件重定义错误
- 不要在有文件实现函数主体
2.宏 #define
1.**作用:**增加可读性; 封装代码
#define PI
#define AVEV = 10*10*PI
推荐define的变量名使用大写,和变量区分开来
宏在运行时候,直接替换掉的,大大提高了代码运行效率
2.无参数宏
//1、定义一个宏,声明一个常数,用以表明1年中有多少秒
#define year_second 365*24*60*60
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define COLOR_RED 1
#define COLOR_YELLOW 2
int main()
{
printf("1.红色");
printf("2.黄色");
int a = 0;
scanf_s("%d", &a, 1);
switch (a)
{
case COLOR_RED:
printf("红色\n");
break;
case COLOR_YELLOW:
printf("黄色\n");
break;
}
return 0;
}
3.有参数宏
有参数宏和函数类似的
因为宏编译时是直接替换的,所以每一个参数,和每一个运算做好加空格,避免程序变异错误
//1. 定义一个宏,实现求两数相加
#define 加法(a,b) ((a)+(b))
//2 .定义一个宏,实现求两数相减
#define 减法(a,b) ((a)-(b))
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//1. 定义一个宏,实现求两数相加
#define 加法(a,b) ((a)+(b)) ///------->每个参数和运算都加上括号,避免出错
//2 .定义一个宏,实现求两数相减
#define 乘法(a,b) ((a)*(b))
int main()
{
//2 * 3 + 3 * 5 = 21
printf("加法(2*3,3*5) = %d\n", 加法(2 * 3, 3 * 5));
//(2 + 3) * (3 + 5)= 16
printf("乘法(2+3,3+5) = %d\n" , 乘法(2 + 3, 3 + 5));
return 0;
}
4.宏和函数比较
- 宏的效率高
- 宏比函数占用内存大,文件更大
- 宏是牺牲空间, 换取速度
- 函数是牺牲速度, 换取空间
- 函数实现简单的时候,推荐使用宏
- 函数实现复杂的时候,推荐使用函数
3.条件宏 #if #ifdef #endif
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define DEBUG
int main()
{
//if define
//条件满足(上面有定义),代码块参与运行
#ifdef DEBUG
//代码块
#endif
//if not define
//条件不满足(上面没有定义),代码块参与运行
#ifndef DEBUG //---->开始
//代码块
#endif //---->结束
}
可以利用条件宏,防止头文件重复定义的情况
#ifdef __TEST.H__
#define __TEST.H__
//头文件
//函数的声明
#endif