一.回顾
上篇文章我们一起学习了C语言中常用的操作符,学会使用这些操作符对我们今后编写程序都是很有效的,这篇文章我们再来学习一个重要的概念---关键字
二.关键字的含义
关键字从字面上来看就是这个字或词的含义很重要,不能乱用,否则会出现许多问题,在C语言中也是这样,C语言关键字特点是不能自己定义、不能用作变量名、不同的关键字有不同的作用与含义
三.C语言关键字有哪些?
以下是C语言的常见关键字:
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 while
四.C语言常见关键字的解释
1.auto
auto的意思是自动,我们在前面C语言作用域中讲到过,当一个变量进入其作用域时便会自动创建,而当变量离开作用域时便会自动销毁,而变量创建与销毁的过程是自动的,所以其实我们在初始化变量的时候前面都有一个 auto 字样,只是C语言将其省略了,如以下代码便是等价的:
auto int a = 10;
int a = 10;
2.break
break语句常用于循环语句如:for循环 while循环 do...while循环 ,其作用是无条件跳出当前循环语句,这个等我们讲到循环时会着重讲
3.short int long float double char
上述几个关键字均为C语言的数据类型下面我们就来逐一介绍
short 意为短整型是 short int 的缩写,其占用的内存空间小于等于 int ,但其能表示的数的范围比 int小
int 意为整型,是目前为止我们使用的最多的一个数据类型
long 意为长整型是 long int 的缩写,当数字超出 int 类型最大值是便应该使用 long 类型,long类型占用的内存空间大于等于 int ,表示数的范围比 int 大 ,如果使用 long 还无法表示这个数据可以考虑使用更大的数据类型 long long int 或 unsigned long long int
float 意为浮点型(单精度)主要用于存放精度要求不高的浮点数
double 意为浮点型(双精度)主要用于存放进度要求较高的浮点数
char 意为字符型,用于存储单一字符,也可以用其来创建字符串
以下是这些变量用法的示例:
short a = 100;
int b = 5000;
long c = 20000;
long long d = 64000000;
float e = 3.14;
double f = 3.1415926;
char g = 'A';
4.const
const限定符的作用是修饰一个变量,使其变成常变量,常变量意思是其属性还是变量但是这个变量不能被改变
如以下代码就演示了 const 的作用:
#include<stdio.h>
int main(void)
{
int monkey = 10;
monkey = 100;
printf("monkey=%d\n",monkey);
getchar();
return 0;
}
当我们没有用 const限定符修饰变量 monkey 时我们运行程序可以发现 monkey 的值有一开始的 10 变成了 100 ,如图所示:
但是当我们使用 const 限定符修饰变量 monkey 时再编译程序便会发现程序报错无法编译,如图所示:
从程序的报错信息中可以知道变量的左值被 const 修饰了,变成了常变量
注意:被 const 限定符修饰过的变量其属性还是变量,只是值不可改变,并非变成了常量!
5.typedef
typedef关键字的作用是为C语言内置的数据类型创建别名
当我们需要创建一个无符号整型的变量时可以使用如下代码:
unsigned int size = 10;
如果觉得输入 unsigned int 过于繁琐,我们可以使用 typedef 给unsigned int 类型创建别名,这里以 u_int 为例,如下代码:
#include<stdio.h>
typedef unsigned int u_int;
int main(void){
u_int size = 10;
return 0;
}
u_int 与 unsigned int 效果相同,如图所示:
6.static
static关键字主要用于
1.修饰全局变量
2.修饰局部变量
3.修饰函数
在讲解每个用途之前先让我们看一段代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void add(void)
{
int i = 0;
i++;
printf("%d ",i);
}
int main(void)
{
int count = 0;
while (count < 10){
add();
count++;
}
getchar();
return 0;
}
我们先可以猜猜看程序会输出什么,可能我们会认为 count 的值为 0 满足while()语句入口条件进入循环,随后调用 add()函数 该函数初始化了变量 i 并对 i 进行自增最后输出 i 的值,需要循环 10 次,所以会输出 1-10 的数字,但是当我们编译运行程序时结果可能会与我们想象的不一样,如图所示:
可以看到程序只是循环输出了 10 个 1 并没有输出 1 -10 的数字这是为什么呢?
这时我们就要讲到变量的作用域问题,在这里变量 i 的作用域是add()函数内部,当进入函数时变量 i 被创建,当函数被调用完成后变量 i 便会被销毁,也就是说这里无论循环多少次变量 i 的值始终都是 1
如果我们不想让变量 i 自动销毁就需要使用 static 关键字对变量进行修饰,使其离开作用域时不会被销毁
用法如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void add(void)
{
static int i = 0;
i++;
printf("%d ",i);
}
int main(void)
{
int count = 0;
while (count < 10){
add();
count++;
}
getchar();
return 0;
}
那么这是如何做到的呢?想要了解就需要先了解内存大致的区域,内存大致可以分为三块区域:
栈区 堆区 静态区
当我们不使用 static 对变量进行修饰的时候,变量便会存入栈区,栈区特点就是进入作用域创建变量离开作用域自动销毁变量,相反当我们使用 static 对变量进行修饰的时候变量便会存入静态区,在静态区中变量的生命周期为程序的生命周期
7.register
register关键字作用是建议编译器将变量放入寄存器中存储
在电脑中常见的存储设备有 硬盘 内存 高速缓存 寄存器 ,而寄存器的读取速度是最快的但其容量也是最小的,所以当我们使用 register 关键字的时候也只是建议编译器将其放入寄存器中,最终是否放入是由编译器所决定的,示例代码如下:
register int a = 100;
该关键字只需要知道即可不常用
2024/1/5