C语言关键字

关键字的分类

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 
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;
}

调试展示C语言关键字_第1张图片

补充内容

作用域概念: 指的是该变量的可以被正常访问的代码区域
生命周期概念:指的是该变量从定义到被释放的时间范围,所谓的释放,指的是曾经开辟的空间”被释放“
局部变量: 进入代码块,形成局部变量[开辟空间],退出代码块,"释放"局部变量
全局变量: 定义完成之后,程序运行的整个生命周期内,该变量一直都有效

二、最快的关键字 - register

作用尽量将所修饰变量,放入CPU寄存区中,从而达到提高效率的目的
补充内容:CPU主要是负责进行计算的硬件单元,但是为了方便运算,一般第一步需要先把数据从内存读取到CPU内,那么也就需要CPU具有一定的数据临时存储能力
注意:CPU并不是当前要计算了,才把特定数据读到CPU里面,那样
太慢了。所以现代CPU内,都集成了一组叫做寄存器的硬件,用来做临时数据的保存
代码演示

#include 
int main()
{
	register int a = 0;
	printf("a = %d\n", a);
	return 0;
}

调试展示在这里插入图片描述

注意:register修饰的变量,不能取地址(因为已经放在寄存区中了,地址是内存相关的概念),不能大量使用register,因为寄存器数量有限
寄存器存在的意义:在硬件层面上,提高计算机的运算效率。因为不需要从内存里读取数据了

其实该关键字,不用管,因为现在的编译器,已经很智能了,能够进行比人更好的代码优化

三、最名不符实的关键字 - static

作用:修饰变量和函数
:

  1. 全局变量,是可以跨文件,被访问的。
  2. 全局函数,是可以跨文件,被访问的。
  • 1.修饰全局变量:修饰后,该全局变量只能在本文件内被使用。
    注:static修饰全局变量,影响的是作用域的概念,函数类似。而生命周期是不变的。
  • 2.修饰局部变量:static修饰局部变量,变量的生命周期变成全局周期。(作用域不变)
    代码演示
#include
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;
} 

调试展示
C语言关键字_第2张图片

  • 3.修饰函数:修饰函数,该函数只能在本文件内被使用,不能跨文件使用

四、最冤枉的关键字-sizeof

为什么说它最冤枉,因为它常年被认为是函数,其实它是一个名副其实的关键字
作用:计算数据类型,变量,或者表达式所占空间大小
补充
C语言关键字_第3张图片
代码演示:

#include
int main()
{
	printf("%d\n", sizeof(int));
	printf("%d\n", sizeof(short));
	printf("%d\n", sizeof(float));
	printf("%d\n", sizeof(double));
	return 0;
}

调式展示:
C语言关键字_第4张图片

五、signed、unsigned 关键字

有符号整数 vs 无符号整数
signed : 第一位为符号位
unsigned :无符号位
C语言关键字_第5张图片

代码演示:

char a = 20;
char b = -10;
unsigned char c = 20;
unsigned char d = -10;

调式展示:
C语言关键字_第6张图片
signed char: 存储数据范围为:-128~127
C语言关键字_第7张图片

unsigned char: 存储数据范围为:0~255
C语言关键字_第8张图片
unsigned char d=-10(存的时候按原来的存,取的时候看数据类型)
补码为 :11110110
所以结果为:246
结论:
:字面数据必须先转成补码,在放入空间当中。所以,所谓符号位,完全看数据本身是否携带±号。和变量是否有符号无关!
:取数据一定要先看变量本身类型,然后才决定要不要看最高符号位。如果不需要,直接二进制转成十进制。如果需要,则需要转成原码,然后才能识别。(当然,最高符号位在哪里,又要明确大小端)
补充:
十进制二进制快速转化:
口诀:1后面跟n个0,就是2的n次方
总结规律: 整数的取值范围
无符号:[0,2^n-1]
有符号:[-2^(n-1), 2^(n-1)-1]

你可能感兴趣的:(c语言,开发语言)