关键字的分类
C语言一共多少个关键字呢?一般的书上,都是32个,但是这个都C90(C89) 的标准。其实 C99 后又新增了5个关键字。不过,目前主流的编译器,对 C99 支持的并不好,默认使用 C90 ,即,认为32个。
关键字 | 说明 |
---|---|
auto | 声明自动变量 |
short | 声明短整型变量或函数 |
int | 声明整型变量或函数 |
float | 声明长浮点型变量或函数 |
double | 声明双精度变量或函数 |
char | 声明字符型变量或函数 |
struct | 声明结构体变量或函数 |
union | 声明供应数据类型 |
enum | 声明枚举类型 |
typedef | 用以给数据类型取别名 |
const | 声明只读变量 |
unsigned | 声明无符号类型变量或函数 |
signed | 声明有符号类型变量或函数 |
extern | 声明变量在其他文件正声明 |
void | 声明函数无返回值或无参数,声明无类型指针 |
if | 条件语句 |
else | 条件语句否定分支(与 if 连用) |
switch | 用于开关语句 |
case | 开关语句分支 |
for | 一种循环语句 |
do | 循环语句的循环体 |
while | 循环语句的循环条件 |
goto | 无条件跳转语句 |
continue | 结束当前循环,开始下一轮循环 |
break | 跳出当前循环 |
default | 开关语句中的“其他”分支 |
sizeof | 计算数据类型长度 |
return | 子程序返回语句(可以带参数,也可不带参数)循环条件 |
一、最宽宏大量的关键字 - auto
作用:一般在代码块中定义的变量,即局部变量,默认都是auto修饰的(auto一般默认修饰局部变量,不修饰全局变量)
代码演示:
#include <stdio.h>
int main()
{
for (int i = 0; i < 2; i++)
{
printf("i=%d\n", i);
if (1)
{
auto int j = 0; //自动变量
printf("before: j=%d\n", j);
j += 1;
printf("after : j=%d\n", j);
}
}
return 0;
}
调试展示:
补充内容
作用域概念: 指的是该变量的可以被正常访问的代码区域
生命周期概念:指的是该变量从定义到被释放的时间范围,所谓的释放,指的是曾经开辟的空间”被释放“
局部变量: 进入代码块,形成局部变量[开辟空间],退出代码块,"释放"局部变量
全局变量: 定义完成之后,程序运行的整个生命周期内,该变量一直都有效
二、最快的关键字 - register
作用:尽量将所修饰变量,放入CPU寄存区中,从而达到提高效率的目的
补充内容:CPU主要是负责进行计算的硬件单元,但是为了方便运算,一般第一步需要先把数据从内存读取到CPU内,那么也就需要CPU具有一定的数据临时存储能力
注意:CPU并不是当前要计算了,才把特定数据读到CPU里面,那样
太慢了。所以现代CPU内,都集成了一组叫做寄存器的硬件,用来做临时数据的保存
代码演示:
#include <stdio.h>
int main()
{
register int a = 0;
printf("a = %d\n", a);
return 0;
}
调试展示:
注意:register修饰的变量,不能取地址(因为已经放在寄存区中了,地址是内存相关的概念),不能大量使用register,因为寄存器数量有限
寄存器存在的意义:在硬件层面上,提高计算机的运算效率。因为不需要从内存里读取数据了
其实该关键字,不用管,因为现在的编译器,已经很智能了,能够进行比人更好的代码优化
三、最名不符实的关键字 - static
作用:修饰变量和函数
注:
- 全局变量,是可以跨文件,被访问的。
- 全局函数,是可以跨文件,被访问的。
- 1.修饰全局变量:修饰后,该全局变量只能在本文件内被使用。
注:static修饰全局变量,影响的是作用域的概念,函数类似。而生命周期是不变的。 - 2.修饰局部变量:static修饰局部变量,变量的生命周期变成全局周期。(作用域不变)
代码演示:
#include<stdio.h>
void fun1()
{
int i = 0;
i++;
printf("no static: i=%d\n", i);
}
void fun2()
{
static int i = 0;
i++;
printf("has static: i=%d\n", i);
}
int main()
{
for (int i = 0; i < 2; i++)
{
fun1();
fun2();
}
return 0;
}
调试展示:
- 3.修饰函数:修饰函数,该函数只能在本文件内被使用,不能跨文件使用
四、最冤枉的关键字-sizeof
为什么说它最冤枉,因为它常年被认为是函数,其实它是一个名副其实的关键字
作用:计算数据类型,变量,或者表达式所占空间大小
补充:
代码演示:
#include<stdio.h>
int main()
{
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(short));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
return 0;
}
调式展示:
五、signed、unsigned 关键字
有符号整数 vs 无符号整数
signed : 第一位为符号位
unsigned :无符号位
代码演示:
char a = 20;
char b = -10;
unsigned char c = 20;
unsigned char d = -10;
调式展示:
signed char: 存储数据范围为:-128~127
unsigned char: 存储数据范围为:0~255
unsigned char d=-10(存的时候按原来的存,取的时候看数据类型)
补码为 :11110110
所以结果为:246
结论:
存:字面数据必须先转成补码,在放入空间当中。所以,所谓符号位,完全看数据本身是否携带±号。和变量是否有符号无关!
取:取数据一定要先看变量本身类型,然后才决定要不要看最高符号位。如果不需要,直接二进制转成十进制。如果需要,则需要转成原码,然后才能识别。(当然,最高符号位在哪里,又要明确大小端)
补充:
十进制二进制快速转化:
口诀:1后面跟n个0,就是2的n次方
总结规律: 整数的取值范围
无符号:[0,2^n-1]
有符号:[-2^(n-1), 2^(n-1)-1]