前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言关键字

C语言关键字

作者头像
小舒不服输
发布2024-01-30 13:53:47
1570
发布2024-01-30 13:53:47
举报
文章被收录于专栏:编程乐园·

关键字的分类

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一般默认修饰局部变量,不修饰全局变量) 代码演示

代码语言:javascript
复制
#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内,都集成了一组叫做寄存器的硬件,用来做临时数据的保存 代码演示

代码语言:javascript
复制
#include <stdio.h>
int main()
{
	register int a = 0;
	printf("a = %d\n", a);
	return 0;
}

调试展示

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

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

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

作用:修饰变量和函数 :

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

为什么说它最冤枉,因为它常年被认为是函数,其实它是一个名副其实的关键字 作用:计算数据类型,变量,或者表达式所占空间大小 补充

代码演示:

代码语言:javascript
复制
#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 :无符号位

代码演示:

代码语言:javascript
复制
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]

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关键字的分类
  • 一、最宽宏大量的关键字 - auto
    • 补充内容
    • 二、最快的关键字 - register
    • 三、最名不符实的关键字 - static
    • 四、最冤枉的关键字-sizeof
    • 五、signed、unsigned 关键字
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档