//-------------------------------------------------------------------------------------------------------------11.关键字
//关键字是C语言本身内置的,不能自己创建
/*
auto break case char const continue default do double else enum
extern float for goto if int long register return short signed
sizeof static struct switch typedef union unsigned void volatile while
*/
// --------------------------------------------------------------------------------------变量的命名
// 1.有意义
// 2.名字必须是字母,数字,下划线组成,不能有特殊字符,同时不能以数字开头
// 3.变量名不能是关键字
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS
//--------------------------------------------------------------------------------------------------------------11.1 关键字 typedef
//类型定义 类型重命名
//给一个类型重新起个新的名字, 只能针对类型
//typedef unsigned int uint; //把 unsigned int 重新定义为 uint
//
//typedef struct Node
//{
// int data;
// struct Node* next;
//}Node; // 把 struct Node 重新定义为 Node
//
//int main()
//{
// unsigned int sum1 = 0;
// uint sum2 = 1;//等价于 unsigned int sum2 = 1
// struct Node n1;
// Node n2;//等价于 struct Node n2
//
// return 0;
//}
//--------------------------------------------------------------------------------------------------------------11.2 关键字 static
//静态
//1.修饰局部变量 2.修饰全局变量 3.修饰函数
//-------------------------------------------------------------------------------------------11.2.1 static修饰局部变量
// static 修饰局部变量的时候,局部变量出了作用域,不会销毁
// 本质上,static修饰局部变量的时候,改变了变量的存储位置
// 影响了变量的生命周期,生命周期变长,和程序的生命空间一样
//void test()
//{
// int a = 1;
// a++;
// printf("%d\n", a);//循环10次, 输出10个2 ??为什么
// //因为a是局部变量,每次使用完,出了作用域就销毁,再进入函数时会重新创建新的a=1
//}
//void test()
//{
// static int a = 1;
// a++;
// printf("%d\n", a); //循环十次,输出2,3,4,5,6,7,8,9,10,11
//}
为什么??????
static 修饰 a 之后, a 不会被销毁,再循环的时候不会重新创建a的值,保留上一次函数作业的值
static 修饰局部变量的时候,局部变量出了作用域,不会销毁
本质上,static修饰局部变量的时候,改变了变量的存储位置,
影响了变量的生命周期,生命周期变长,和程序的生命空间一样
//
//int main()
//{
// int i = 0;
// while (i < 10)
// {
// test();//调用函数test
// i++;
// }
//
// return 0;
//}
//---------------------------------------------------------------------------------------------11.2.2 static修饰全局变量
//
// 全局变量 大括号外边的变量,
// 没有static时, 全局变量在其他源文件时中也可以使用,需要声明外部符号
// 全局变量具有外部链接属性
// static 修饰全局变量的时候,这个全局变量的外部链接属性,就变成了内部链接属性,其他源文件就不能再使用到这个全局变量了
// 我们在使用的时候,就感觉到作用域变小了
//定义全局变量 int g_val = 2022; 到 add.c 中
//extern int g_val; //extern 关键字 -----声明外部符号
//
//int main()
//{
// printf("%d\n", g_val); //需要声明外部符号
// //输出2022
//
// return 0;
//}
//----------------------------------------------------------------------------------------------11.2.3 static修饰函数
// 把函数放到 add.c 里
//int Add(int x, int y)
函数值需要返回时,用int; 函数值不需要返回时,用void
//{
// return x + y;
//}
//extern int Add(int x, int y); // extern关键字
一个函数, 本来是具有外部链接属性的,加上 static 以后,就不在具有外部链接属性
就变成了内部链接属性,其他源文件就不能再使用到这个全局变量了
//
//int main()
//{
// int a = 10;
// int b = 20;
// int sum = Add(a, b);//调用函数Add(int x, int y)
// printf("%d\n", sum);
//
// return 0;
// }
//-----------------------------------------------------------------------------------------11.3 关键字 register (寄存器)
//电脑上的存储设备有哪些?
// 寄存器(集成到CPU上)
// 高速缓存(cache)
// 内存
// 硬盘
// 越靠上访问速度越快,空间越小,造价越高
// 越靠下访问速度越慢,空间越大,造价越低
自己创建寄存器变量
//int main()
//{
// register int num = 3;//寄存器变量 ,建议 3 存放在寄存器中,只是建议,实际情况电脑自己会判断
//
// return 0;
//}
//--------------------------------------------------------------------------------------------12. #define 定义常量和宏
//define 不是关键字,他是预处理指令
// define定义标识符常量
//#define NUM 100//定义常量
//int Add(int x, int y)
//{
// return x + y;
//}
// define 定义宏
// 宏是有参数的
#define ADD (x, y) ((x)+(y))
// 宏名 宏的参数 宏体
int main()
{
//printf("%d\n", NUM);//输出100
//int n = NUM;
//printf("%d\n", n);//输出100
//int arr[NUM] = { 0 };
//printf("%d\n", arr[4]);//输出0
int a = 10;
int b = 20;
int z = ADD(a, b);
printf("%d\n", z);
return 0;
}