09 - 初学作用域和预处理

作用域和预处理

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值