【C语言】32个关键字

C语言32个关键字

文章目录

由ANSI标准定义的C语言关键字共32个:

c 复制代码
 auto  double  int  struct  break  else  long  switch
 case  enum  register  typedef  char  extern  return  union
 const  float  short  unsigned  continue  for  signed  void
 default  goto  sizeof  volatile  do  if  while  static

根据键字的作用,可以将关键字分为数据类型关键字流程控制关键字两大类。

1.数据类型关键字

基本数据类型(5个)

void 声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果
char 字符型类型数据,属于整型数据的一种
int 整型数据,通常为编译器指定的机器字长
float 单精度浮点型数据,属于浮点数据的一种
double 双精度浮点型数据,属于浮点数据的一种

类型修饰关键字(4个)

short 修饰int,短整型数据,可省略被修饰的int
long 修饰int,长整形数据,可省略被修饰的int
signed 修饰整型数据,有符号数据类型
unsigned 修饰整型数据,无符号数据类型

复杂类型关键字(5个)

struct 结构体声明
union 共用体声明
enum 枚举声明
typedef 声明类型别名
sizeof 得到特定类型或特定类型变量的大小

存储级别关键字(6个)

auto 指定为自动变量,由编译器自动分配及释放。通常在栈上分配
static 指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部(单片机开发中,此变量值执行一次)
extern 指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定由另外文件声明 (在单片机开发中,声明的这个变量可以让多个文件访问到)
const 与volatile合称"cv特性",指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)

2.流程控制关键字

跳转结构(4个)

return 用在函数体中,返回特定值(或者是void值,即不返回值)
continue 结束当前循环,开始下一轮循环
break 跳出当前循环或switch结构
goto 无条件跳转语句

分支结构(5个)

if 条件语句
else 条件语句否定分支(与if连用)
switch 开关语句(多重分支语句)
case 开关语句中的分支标记
default 开关语句中的"其他"分治,可选(一般条件都不符合,我们会走这个分支)

循环结构(3个)

for 循环结构
while 循环结构
do 循环结构

其它(2个)

typedef 给数据类型取别名
sizeof 计算对象所占内存空间大小

详解

基本数据类型

1.unsigned

unsigned :无符号的

  • 用来声明一个无符号的变量
c++ 复制代码
unsigned char var; //var的范围:0~255
2.signed

signed :有符号的(可以省略不写)

  • 用来声明一个有符号的变量。
c++ 复制代码
signed char var; //var的范围:-128~127
3.char

字符型

  • 用来声明一个字符型变量
  • 占一个字节空间
  • 范围是 -128~127 ;uchar 表示无符号的类型,所以表示的范围是 0~255
4.int

int :整型

  • 用来声明一个整型变量
  • C51:占两个字节空间, ARM:占四个字节
  • 当前主流的编译器中int 类型无论在 32 位或 64 位系统中都是 4 个字节。
c++ 复制代码
int var; 
5.float

float :浮点型

  • 用来声明一个浮点型(实型)变量
  • 表示单精度浮点数,占 4 个字节
  • 最多能表示到7个有效数据位
c++ 复制代码
float var;
6.double

double :双精度型

  • 用来声明一个双精度实型变量
  • 占八个字节
  • 最多能表示到15~16个有效数据位
c++ 复制代码
double var;
7.short

short :短整型

  • 用来声明一个短整型变量
  • C51:跟int一样,ARM:占两个字节
c++ 复制代码
short var; 
8.long

long :长整型

  • 用来声明一个长整型变量
  • ARM:跟int一样,C51:占四个字节
c++ 复制代码
long var; 
9.void

void :空型

  • 表示一个函数没有返回值,或者无形参
c++ 复制代码
void function(void);
类型/编译器 16位编译器 32编译器 64编译器
void 0 0 0
char 1 1 1
char * 4 4 8
short int 2 2 2
int 4 4 4
float 4 4 4
double 8 8 8
long 4 4 8
long double 12 12 16
long long 8 8 8

一般来说习惯上用n,m,i,j,k 等表示int 类型的变量;c,ch 等表示字符类型变量;a 等表示数组;p 等表示指针。当然这仅仅是一般习惯,除了i,j,k 等可以用来表示循环变量外,别的字符变量名尽量不要使用。

构造数据类型

1.struct
  • 用来声明一种结构体类型
c++ 复制代码
struct stu{
    char sex;
    int age;
    float score;
    struct stu *Next;
};
struct stu var; 
2.union
  • 用来声明一种共用体类型
  • 该类型的变量所在空间的大小以其成员占最大的那个为准
  • 存入该变量中的值以程序中最后存入的数值为当前值
c++ 复制代码
union non{
    char sex;
    int age;
    float score;
};
union non var; 

struct用法与union一样,两者不同的是结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

一般union用的不多

3.enum
  • 用来声明一种枚举类型
  • 规定枚举类型的变量,只能在限定的范围内取值,否则,编译会出现警告(达到数据安全的效果)
c++ 复制代码
enum em 
{a = 23,b,c,d = 56,e}; //其中b=24,c=25,e=57
enum em var;

数据的存储类别

1.auto

auto :自动的(可省略不写)

  • 定义一个局部变量,默认为auto类型的
  • 当它所在的函数调用结束时,释放内存
  • 使用时才分配内存,用完即释放
c++ 复制代码
auto char var; 
2.static

static :静态的

  • 定义一个局部变量,该变量在定义时只进行一次初始化,以后每次调用它所在的函数,其值都会保持上一次调用的结果,它所在的空间不会被释放
  • 被static修饰的全局变量,则只能在它所在的C源文件中使用,其它文件不能调用,(内部全局变量)
  • 被static修饰的函数,只能在该函数所在的C源文件中被调用,其它文件不能调用,(内部函数)
c++ 复制代码
static char var;
static void function();
3.extern

注意:声明的变量和函数必须是全局的,如果只用在函数内部会报错

extern :外部的

  • 想要调用别的C源文件中的某一个全局变量,可以使用该关键字在该文件中修饰声明该变量,即可调用(前提是该变量没有被static修饰)
  • 该类型的变量也是一直占着内存不释放
  • 想要调用别的C源文件中的某一个函数,可以使用该关键字在该文件中修饰声明该函数,即可调用(前提是该函数没有被static修饰)
c 复制代码
extern char var;
extern void function();
4.register

register :寄存器的

  • 被这个关键字修饰的变量,建议编译器将该变量在使用时放到CPU内部寄存器中,以提高执行效率
  • 注意:该关键字只是"建议",到底有没有将变量放到寄存器中无从得知。一般使用在循环次数比较多的地方。
  • 在使用时才分配内存,用完即释放
c++ 复制代码
register long i = 30000;

数据优化

1.const

const :声明只读变量

  • 常变量:被const关键字声明的变量,其值不能被改变
  • 即在声明该变量时必须要初始化该变量
  • var本身还是一个变量。(数据安全检测)
c++ 复制代码
const char var = 100;
char arr[var]; //试图声明一个长度为100的字符型数组
//在MDK (ARM)中可以使用常变量来声明数组的长度
//在VC++编译环境中也可以。
//在C51-keil中不可以使用常变量来声明数组的长度
char *const p;
//指针变量p不可改变,但是它指向的地址里面的值可变 
char const *p; 或 const char *p;
//指针变量p可以改变,但是它所指向的地址里面的值不能改变 
const char * const p; //p地址不可改变,里面的值也不能变
2.volatile

volatile :随时会改变的

  • 被volatile修饰的变量或寄存器会意想不到地发生改变。
  • 某些变量或寄存器(如状态寄存器)可能会受硬件影响
  • 在多线程任务中,被其它线程修改(共享内存段)
  • 一个在中断服务中使用到的全局变量
  • 编译器会对C程序进行优化
c++ 复制代码
//为了保证程序不被优化,保证CPU取到的数据是最新的
//(即提醒CPU每次都必须到内存中取出变量当前的值而不
//是取cache或者寄存器中的备份),使用该关键字修饰,如:
int *p; *p = 1; *p = 2;
//编译时,编译器会对上面的语句进行优化,
//会直接优化成:
int *p; *p = 2;
//为了保证上面的语句不被优化,加volatile修饰变量:
int * volatile p;

语句

1.选择结构

1.if
  • 用法:顺序判断if后的"表达式"是否为真
  • 如果碰到为真的情况,则执行其下面的{}里的"语句
  • 执行完后,即退出这个"多选一"的结构

if -else if -else if ... else

c++ 复制代码
if(表达式1) 
{语句s;}
else if(表达式2) 
{语句s;}
else if(表达式3) 
{语句s;}
else
{语句s;}
2.switch-case
  • 用法:顺序判断"变量"是否与"常量"相等,
  • 如果相等,则执行该常量:后的"语句",遇到break即跳出
c++ 复制代码
switch(变量) 
{
    case 常量1:语句;...;break;
    case 常量2:语句;...;break;
    case 常量3:语句;...;break;
    default:语句; 
}
c++ 复制代码
unsigned char i = 6;
unsigned char dat;
switch(i)
{
    case 3:dat = 5;break;
    case 5:dat = 34;break;
    case 6:dat = 99;break;
    case 7:dat = 56;break;
    case 6:dat = 100;break;
    default:dat = 68; //默认执行
}

注:如果少了break,则顺序判断i的值与case后面的常量是否相等,如果相等,则执行其后面的语句,以后不再判断,再继续执行下面的每一条case 后面的语句,直到default。

2.循环结构

1.for
  • 用法:语句1:条件初始化,语句2:判断语句,判断条件是否成立,语句3:修改条件语句
  • 先执行语句1,再进行对语句2的判断,如果成立则执行{}里的语句4...,再执行语句3,在判断语句2是否依然成立,。当语句2不成立时,结束循环
c++ 复制代码
for(语句1;语句2;语句3) 
{
    语句4;
    语句...;
}
c++ 复制代码
for(int i =0;i<5;i++)
{
    
}
2.while
  • 用法:先判断"表达式"是否成立,如果成立则执行{}里的语句,执行完再次判断"表达式"是否依然成立,成立则继续执行{},不成立则结束
c++ 复制代码
while(表达式) 
{
    语句;
    ....;
}

如何来设计一个死循环?两种方法:

c++ 复制代码
for(;;)
while(1)
3.do while
  • 用法:先执行{}里的语句,执行完后,判断"表达式"是否成立,如果成立,继续执行{};如果不成立,则结束循环
c 复制代码
do{
    语句1;
    ...;
}while(表达式);

3.转移结构

1.break
  • 仅用于跳出循环结构
  • 且仅能跳出一层循环结构
c++ 复制代码
for(i=10;i>0;i--)
{
    t = 10;
    while(t--)
    {
        dat++;
        if(dat == 3)
            break;//跳出while()结构。
    } 
}
2.continue
  • 用于终止本次循环,继续从下次循环开始
  • 正式程序中不使用,仅用于调试程序
c++ 复制代码
char buf = 10;
while(buf--)
{ 
    a++;
    b++;
    continue;//遇到continue则结束这次循环
    d++; //这条永远都不会执行到 
    e++; //这条永远都不会执行到 
}
3.goto
  • 无条件转移
  • 一般都不建议在大的程序当中使用
c++ 复制代码
unsigned char dat=10;
while(dat--)
{ 
    a++;
    b++;
    Lable: c++;
    if(c == 3)
        goto Lable;//直接跳到Lable标号去 
    d++;
}
4.return
  • 用于函数返回,在函数调用时,遇到return即返回。
  • 如果需要返回某个值,在其后加上返回值。
  • 返回值类型必须和函数类型一致
c++ 复制代码
void function()
{
    char a,b; 
    a++;
    return; //遇到return即返回调用处
    b++; //不会被执行
    return; //不会被执行
}

其它

1.typedef

typedef : 类型重定义

typedef与宏定义define的区别:

typedef define
typedef 是在编译阶段进行定义 宏定义是在预编译处理阶段完成展开
typedef 是类型重新定义,不是简单地替换 宏定义只是简单的替换,没有定义
c++ 复制代码
//1.用uchar重新定义unsigned char
typedef unsigned char uchar;

//2.用uchar 替换unsigned char
#define uchar unsigned char
c++ 复制代码
typedef unsigned char* M;
#define M unsigned char*
M p1,p2;
//对于typedef来说:p1是指针变量,p2也是
//对于宏定义来说:p1是指针变量,p2是普通变量
2.sizeof

sizeof:用来求类型所占的字节数

c++ 复制代码
int var = 10;
char g; 
g = sizeof(var++);//g = 4;
//注意:var++该条语句没有被执行!
//()里的语句是不会被执行的。
相关推荐
waicsdn_haha8 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
嵌入式科普9 分钟前
十三、从0开始卷出一个新项目之瑞萨RZN2L串口DMA接收不定长
c语言·stm32·瑞萨·e2studio·rzn2l
_WndProc10 分钟前
C++ 日志输出
开发语言·c++·算法
qq_4335545419 分钟前
C++ 面向对象编程:+号运算符重载,左移运算符重载
开发语言·c++
车轮滚滚__23 分钟前
uniapp对接unipush 1.0 ios/android
笔记
数据小爬虫@38 分钟前
如何高效利用Python爬虫按关键字搜索苏宁商品
开发语言·爬虫·python
ZJ_.40 分钟前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
Narutolxy1 小时前
深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223
开发语言·golang·gin
Hello.Reader1 小时前
全面解析 Golang Gin 框架
开发语言·golang·gin
禁默1 小时前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程