一、常见关键字:
//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
对于define、include它们不是关键字,而是预处理指令
//注:现在先列出关键字,防止在定义变量名时使用到关键字
二、简单讲解几个关键字
1.typedef
typedef unsigned int u_int; //typedef :类型重命名(可以将复杂的类型简单化 - 将unsigned int 重命名u_int) int main() { //signed(有符号) unsigned(无符号) unsigned int num1 = 100; u_int num2 = 20;//同unsigned int num2=20; return 0; }
2.static - 静态的(可以修饰局部变量、全局变量、函数)
2.1.static修饰局部变量
#include<stdio.h> void test1() { int a = 1; a++; printf("%d ", a); } //问程序结束后的结果?(可以先思考再与下面的答案校对) int main() { int i = 0; while (i < 10) { test1(); i++; } //程序结束结果是:2 2 2 2 2 2 2 2 2 2 //在test1函数内创建了局部变量a,test1函数结束时int a=2被销毁,而在每次重新进入test1时又重新创建int a=1 return 0; }
#include<stdio.h> void test2() { static int a = 1; a++; printf("%d ", a); } //问现在加上static修饰局部变量的结果?(可以先思考再与下面的答案校对) int main() { int i = 0; while (i < 10) { test2(); i++; } //程序结束结果是:2 3 4 5 6 7 8 9 10 11 //第一次进入test2函数内部,创建了局部变量a,且出来后并未销毁a //static修饰局部变量,改变了局部变量的生命周期(本质上是改变了变量的存储类型) //加上static的局部变量a,由栈区转向静态区,生命周期同全局变量一样 // 栈区 堆区 静态区 // ------------ -------------- -------------------- // | 局部变量 | 动态内存分配 | 全局变量 | // | 函数的参数 | |static修饰的静态变量| // ------------ -------------- -------------------- return 0; }
2.2.static修饰全局变量(这里新建2个文件)
文件一
#include<stdio.h> //extern声明外部符号 - 可以不加 extern int g_va1; extern int g_va2; int main() { //全局变量声明后在整个工程中都可以使用 printf("%d\n", g_va1); //不能另一个文件中使用static修饰的全局变量 //printf("%d\n", g_va2);//err //static修饰全局变量,使得这个全局变量只能在自己所在的源文件内部可以使用,其它文件不能使用 //为什么全局变量能在其它源文件内部使用? //全局变量在其它源文件内部可以使用,是因为全局变量具有外部链接属性;但是被static修饰后,就变成了内部链接属性,其它源文件不能链接到这个静态全局变量了 return 0; }
文件二、
//定义全局变量 int g_va1 = 2022; static int g_va2 = 2021;
2.3.static修饰函数(这里新建2个文件)
文件一
#include<stdio.h> //声明函数 - 只要函数名、返回类型、参数类型(不一定需要参数名) extern int Add1(int, int); int main() { int a = 10; int b = 20; //没有使用static int sum1 = Add1(a, b); printf("sum=%d\n", sum1); //使用了staitc - err /*int sum2 = Add2(a, b); printf("sum=%d\n", sum2);*/ //static修饰函数,使得函数只能在自己所在的源文件内部使用,不能在其它源文件内部使用 //本质上static是将函数的外部链接属性变成了内部链接属性(同static修饰全局变量) return 0; }
文件二
定义全局变量 int Add1(int x, int y) { return x + y; } static int Add2(int x, int y) { return x + y; }
3.define定义常量和宏 - define是一个预处理指令
3.1.define定义常量
#include<stdio.h> #define A 2021 int main() { printf("%d\n", A);//2021 return 0; }
3.2.define定义宏
#include<stdio.h> #define Add1(x,y) x+y #define Add2(x,y) ((x)+(y)) int main() { printf("%d\n", Add1(2, 3)); printf("%d\n", 4*Add1(2, 3));//11 //难道这里的结果不应该是20吗? //其实上面定义的Add1是有缺陷的 //2和3传上去后,它会替换x和y得到4*2+3 = 11 //解决方法 //1.在调用的时候改变 printf("%d\n", 4 * (Add1(2, 3)));//20 //2.在定义的时候改变 - 将后面的表达式定义为一个整体 printf("%d\n", 4 * Add2(2, 3));//20 //当然是第二种方法更好 return 0; }