截至目前为止,C语言关键字共有32个,它们分别是:
1、{auto、static}//动态静态空间开辟
2、{char、short、int 、long 、float 、double 、unsigned 、signed}、//类型
3、{ if、 else 、do 、while、 switch、 case、 break、 default、 continue、 goto、 for }、//判断,选择,循环语法
4、{const 、enum、 extern、 register、 sizeof、 struct、 typedef、 union、 void、 volatile、 return }//特殊意义关键字
大致可分为这么4个类别,那么,接下来就简单介绍一下第4组,常用的特殊关键字。
No1,**********const*********
在程序员编译过程中,可将不希望后期发生改变的变量加上const加以保护, 在C语言中,const 定义的常变量,具有常属性,其值不可改变,但本质上还是变量。在C++中,直接将const定义的变量当作常量处理。举个栗子:
void test()
{
const int num=1;
int array[num]={0};
//在.C中,const 定义的常变量,具有常属性,但仍是变量,故而,这样书写是错误的,但在.cpp文件中,这样书写就是正确的,直接将num当作常量对待。
}
#include<stdio.h>
int main()
{
const int num=10;
num=20;//这里对num进行了值得修改,程序失败
printf("%d\n",num);
return 0;
}
No2、**********enum*********
enum(枚举):简单的说枚举也是一种数据类型,这种数据类型只包含数据的集合,举个栗子:
enum Sex {
MALE, //0
FEMALE,//1
SECRET//2
};
用法: enum Sex sex=MALE;
enum Sex {
MALE=1, //1
FEMALE=2, //2
SECRET=3 //3
};
//枚举允许附初值
No3、**********extern*********
extern 是用于变量,函数声明的关键字。
extern int g_val;//变量声明
extern void test();//函数声明
int main()
{
void test();//hello world
printf("%d\n",g_val);//2017
}
void test()
{
printf("helloworld\n");
}
int g_val=2017;
实际上,程序若直接写int g_val;但主函数输出值将会把g_val按全局变量处理,输出值为0;为了区别,故而在变量前加上extern,来说明该条语句仅是变量(函数)声明。
No4、**********register*********
register寄存器变量。
如图所示,运行速度寄存器>高级缓存区>内存>硬盘,故而,将一些运算数值较大的放在register中,作用是建议CPU优先从寄存器中取值处理,但
register int num=10;
&num
这种操作时错误的,&(取地址运算符)是找到变量在内存中的地址空间,而显然寄存器不属于内存中的一部分,所以&num找不到相应地址。
No5、**********static*********
static静态变量的定义。
static修饰局部变量,改变局部变量的生命周期,不改变作用域
static修饰全局变量,改变全局变量的作用域,不改变生命周期
void test1()
{
static int a=1;
a++;
printf("%d",a);
}
static int g_val=1;
void test2()
{
g_val=1;//变量赋值
g_val++;
printf("%d\n",g_val);
}
int main()
{
int i=0;
for(i=0;i<10;i++)
{
void test1();//2,3,4,5,6,7,8,9,10,11
void test2();//2,2,2,2,2,2,2,2,2,2
}
return 0;
}
No6、**********typedef*********
typedef类型定义形式:typedef 被替换类型 替换类型
int main()
{
unsigned int age=20;
unsigned int aver=20;
unsigned int score=20;
unsigned int size=20;
printf("%d\n",age);
}
上述例子中,多次出现unsigned int 类型,为了后继便于书写,可将该类型重新定义,如typedef unsigned int unit;后面凡遇到unsigned int 的地方均可用unit代替。如:unit age=20;
No7、**********void*********
void 无返回值类型
void test()
{
printf("hello world\n");
}
int main()
{
test();
test(1);
test(1,2);
test(1,2,3);
}
//屏幕上输出四次hello world
void test(void)//第一个void 代表函数无返回值,第二个代表函数无参
{
printf("hello world\n");
}
int main()
{
test();
test(1);
test(1,2);
test(1,2,3);
}
//编译错误,程序无法正常执行
No8、**********volatile*********
voiltile保证内存的可见性,每次对num的值从内存中取,而并非从寄存器中直接取
int main()
{
const int num=10;
int* p=(int*)#
printf("%d\n",num);//运行结果为10
*p=20;
printf("%d\n",num);//运行结果为10
}
这段代码执行完毕后,程序运行结果均为10,但观察内存可知,在程序运行的过程中num确实被改到20,这是什么情况哩?怎么解决?
int main()
{
volatile const int num=10;
int* p=(int*)#
printf("%d\n",num);//运行结果为10
*p=20;
printf("%d\n",num);//运行结果为20
}
//这里volatile 保证内存的可见性。
No9、**********sizeof*********
sizeof求变量内存空间所占字节数。用法形式为sizeof(类型)或sizeof(变量名),举个栗子:
int main()
{
int a=10;
int array[10]={0};
printf("%d\n",sizeof(int)); //4
printf("%d\n",sizeof(a)); //4
printf("%d\n",sizeof(array)); //4*10=40
return 0;
}
No10、**********struct********
代码九九归一,至于这第十个,struct,欲知后续结果,请看下回分解