c语言有多少关键字
你知道C语言有多少关键字吗?你能一一说出它们的名字与作用吗?
肯定有许多人答不上来,那么让我告诉你C语言一共32个关键字,具体如下:
关键字 | 意义 |
---|---|
auto | 声明自动变量,缺省时编译器一般默认auto |
int | 声明整型变量 |
double | 声明双精度变量 |
long | 声明长整型变量 |
char | 声明字符型变量 |
float | 声明浮点型变量 |
short | 声明短整型变量 |
signed | 声明有符号类型变量 |
unsigned | 声明无符号类型变量 |
struct | 声明结构体变量 |
union | 声明联合数据类型 |
enum | 声明枚举类型 |
static | 声明静态变量 |
switch | 用于开关语句 |
case | 开关语句分支 |
default | 开关语句中的“其他”分支 |
break | 跳出本次循环 |
register | 声明寄存器变量 |
const | 声明只读变量 |
volatile | 说明变量在程序中执行可被隐含地改变 |
typedef | 用以给数据类型取别名,当然也有别的作用 |
extern | 声明变量是在其他文件中声明(也可以看作是引用变量) |
return | 子程序返回语句(可带参数也可不带参数) |
void | 声明函数无返回值或者无参数,声明空类型指针 |
continue | 结束当前循环,进入下一轮循环 |
do | 循环语句的循环体 |
while | 循环语句的循环条件 |
if | 条件语句 |
else | 条件语句否定分支 |
for | 一种循环语句 |
goto | 无条件跳转语句 |
sizeof | 计算对象所占内存空间大小 |
定义与声明
定义:编译器创建一个对象,为该对象分配一块内存并为之取一个名字
声明:1.告诉编译器这个名字已经分配上内存了2.告诉编译器,这个名字已经被预定了,不得重名。
int i;//定义
extern int i;//声明
register
这个关键字就是让变量存在寄存器中
注意点:
register修饰的变量必须是CPU所能接受的类型,就是该变量必须是单个值且小于等于整型长度(想想汇编就明白了)
由于该变量不存在内存,所以不能用&取地址
static
修饰变量
变量又分局部变量与全局变量
1.静态全局变量:
作用域仅限于变量被定义的文件中,其他文件即使用extern声明也无法使用
2.静态局部变量:
在函数体中定义,只能在该函数中使用,当让这个静态变量即使函数结束也不会被销毁
修饰函数
静态函数:对函数的作用域仅限与本文件(内部函数)
好处:不同的人编译不同的函数时,不用担心自己定义的函数是否与其他文件中的函数同名
sizeof
int i;
sizeif i;
此时得到的值是多少?4,即使sizeof不叫括号也能预算,所以它一定不是函数。
int *p = NULL;
sizeof(p)//地址4
sizeof(*p)//数4
int a[100]
sizeof(a) //数组块 400
sizeof(a[100]) //值,此值随机 4
sizeof(&a) //4
signed\unsigned
int main()
{
signed char a[1000];
int i;
for(i=0;i<1000;i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}
得到的为255
为什么,补码问题,后面会详细解释
void
其作用:对函数返回的限定,对函数参数的限定
1.如果函数没有返回值,那么应将其声明为void类型
2.如果函数无参数,那么应声明其参数为void
3.在使用void*指针的时候,一定要用限定类型再操作
4.void声明的是一种抽象
return
return不可返回“栈内存”的指针,因为该内存在函数体结束后会被销毁
const
编译器通常不为普通const只读变量分配存储空间,而是将他们保存在符号表中
而宏定义是立即数,从编译的角度来看宏定义有若干份备份,而const只有一份,且宏定义是没有类型的,而const有,那么类型出错也会报error
那么我们最常碰到是咋么记住const修饰的指针或者指针变量,记住“进水楼台先得月”,去掉类型名,看const修饰谁
volatile
告诉编译器不要优化,继续去取内存中的值,
const和volatile放在一起的意义在于:
(1)本程序段中不能对a作修改,任何修改都是非法的,或者至少是粗心,编译器应该报错,防止这种粗心;
(2)另一个程序段则完全有可能修改,因此编译器最好不要做太激进的优化。
“const”含义是“请做为常量使用”,而并非“放心吧,那肯定是个常量”。
“volatile”的含义是“请不要做没谱的优化,这个值可能变掉的”,而并非“你可以修改这个值”。
因此,它们本来就不是矛盾的。
const volatile int = 10没有任何问题。
extern
表明变量或者函数的定义在别的文件中
struct
一个空的结构体sizeof一般来讲为1,当然可能也为0
柔性数组
struct st_type
{
int i;
int a[];
}type_a;
union
在union中所有成员公用一个空间,这就涉及到了大小端模式
在此不实际拓展开来
enum
枚举常量,当然常量也是可以被赋值得
- 宏常量在预编译阶段只是简单替换;枚举常量测试在编译的时候才确定其值
- 一般在调试器里面,可以调试枚举常量,但不能调试宏常量
- 枚举可以一次定义大量相关的常量,宏常量只能定义一次
typedef
为已经存在的数据类型取个别名
typedef取的别名不支持类型拓展
typedef int int32
unsigned int32 j=32会报错