(C语言)32个关键字

概要

数据类型关键字(12)

char : 声明字符型变量或函数
short : 声明短整型变量或函数
int : 声明整型变量或函数
long : 声明长整型变量或函数
signed : 声明有符号类型变量或函数
unsigned : 声明无符号类型变量或函数
float : 声明浮点型变量或函数
double : 声明双精度变量或函数
struct : 声明结构体变量或函数
union : 声明共用体(联合体)数据类型
enum : 声明枚举类型
void : 声明函数无返回值或无参数,声明无类型指针

控制语句关键字(12)

1. 循环控制(5个)

for : 一种循环语句
do : 循环语句的循环体
while : 循环语句的循环条件
break : 跳出当前循环
continue : 结束当前循环,开始下一轮循环

2. 条件语句(3个)

if : 条件语句
else : 条件语句否定分支
goto : 无条件跳转语句

3. 开关语句 (3个)

switch :  用于开关语句
case : 开关语句分支
default : 开关语句中的 其他 分支

4. 返回语句(1个)

return : 函数返回语句 ( 可以带参数,也看不带参数 )

存储类型关键字(5个)

在一个变量定义的时候只能有一个存储类型的关键字出现。
auto : 声明自动变量,一般不使用
extern : 声明变量是在其他文件中声明
register : 声明寄存器变量
static : 声明静态变量
typedef : 用以给数据类型取别名 ( 但是该关键字被分到存储关键字分类中,虽然看起来没什么相关性 )

其他关键字(3个)

const : 声明只读变量
sizeof : 计算数据类型长度
volatile : 说明变量在程序执行中可被隐含地改变

主要内容:

1.register(建议性)修饰变量,尽量将所修饰变量放入CPU寄存器中,从而达到提升效率的目的。

使用建议:①局部变量。②不会被写入的变量。③高频被读取的变量(比如用于while(date),循环判断条件)。④寄存器数量有限,不要大量使用。⑤register修饰的变量不建议取地址(地址是内存的概念)。

2.auto:一般局部变量默认为auto修饰。

3.static修饰全局变量和函数,使它们只能在本文件中使用,不能被外部文件直接访问为项目维护提供了安全保证。修饰局部变量,改变了局部变量的生命周期(本质是将局部变量存储在静态区)。

4.sizeof:不是函数,是操作符关键字,用于确定一种类型对应开辟空间的大小。

5.signed:有符号字符型。unsigned:无符号字符型。                                                                ①.数据的存储:unsigned int a=-10; 这是没有问题的。空间不关心内容,单纯的数据没有意义,变量类型在读取的时候才有意义,类型决定了如何解释空间内部保存的二进制序列。②大端存储:按字节为单位,数据高权值位存储在低地址处;小端存储:按字节为单位,数据高权值位存储在高地址处。 ③二进制转十进制:1->2^0 , 10->2^1 , 100->2^2 , 1000->2^3 。④unsigned int b = 10u,保持等号两端数据类新一致。(10u : unsigned int ; 10 : int )

6.if: if(!flag)推荐写法,直观反映flag是"bool"。①if语句,先执行()中的表达式或者函数,得到真假结果。②条件判定功能。③进行,分支功能。④if else  联用,遵循就近原则。

7.float、double:浮点数在进行比较的时候,绝对不能直接使用==进行比较,因为浮点数本身有精度损失,进而导致各种结果可能有细微的差别。if(x==y) =>  if(fabs(x-y)  if(fabs(x)

8.NULL:0 ‘\0’ "NULL" 的类型不同,数值都为0。

9.switch&&case&&break&&default:①switch语法结构中,case完成的判定功能,break完成的分支功能,default处理异常情况。②case后面不能跟变量或者常变量,也不能定义变量,一定需要的话,可以加{}或者封装为函数。③default:可以出现在任何地方,推荐放在最后面。

10.while&&do{}while;&&for:①循环条件初始化。②循环条件判定。③循环条件更新。死循环:while(1);for(;;);do{}while(1);

11.break:跳出循环。continue:结束本次(一次)循环,while与do while 跳转到条件判断,for跳转到条件更新处。两循环嵌套,最好将循环次数多的放在里面,for循环最好前闭后开,便于循环次数统计。

12.goto:遇到 goto end;  跳转到 end: 处(end为标记位,自己定义名字,goto语句不能跨代码块使用)。

13.void:void 不能定义变量,因为void本身被编译器解释为空类型,强制的不允许定义变量。但可以定义指针,因为指针大小是明确的,VS2019中:sizeof(void)  0 字节,Linux 中,sizeof(void)  为1字节,所以void * p,VS中不能进行p++等操作,而Linux中可以。C语言可以不带返回值,默认返回值为int。void *p 不能直接解引用,它能被任意类型的指针接收,也可以接受任意类型的指针(常用)。

14.return:函数的返回值通过寄存器(eax)的方式返回给函数调用方,函数的返回值具有常属性。main 函数return 0的原因:声明的main函数是有返回值的话,那么就必须返回一个给定类型的值。比如int main() 就需要返回一个int类型的值,通常用0,因为操作系统的习惯是认为返回0是正常退出。

15.const:修饰的变量具有只读属性,不可直接修改,可以通过指针方式间接修改。作用(于编译阶段):①让编译器进行直接修改式检查。②告诉其他程序员,后面不要直接修改,也属于一种“自描述”。const修饰指针(关键字不能修饰关键字):①const int *p = &a(int const *p = &a),const修饰 * ,p指向的变量,a不能直接被修改。② int * const p = &a,const修饰 p,p的内容不能直接修改,即p的指向不能变。const修饰函数返回值(返回指针)。

16.volatile:多用于并发场景,保持内存可见性。不希望被编译器优化,达到稳定访问内存的目的。const(不要进行直接写入) volatile(读取时每次都要往内存读) int a=100;

17.struct:定义结构体其实就是在制作类型。柔性数组如下:

#define _CRT_SECURE_NO_WARNINGS 1

#include
#include

//#define NUM 64
//
//struct stu {
//	char name[NUM / 2];
//	int age;
//	char sex;
//	char addr[NUM];
//}*p,x;
//
//void test(struct stu* p)
//{
//	printf("%s\n", p->name);
//	printf("%d\n", p->age);
//	printf("%c\n", p->sex);
//	printf("%s\n", p->addr);
//}
//
//int main()
//{
//	strcpy(x.name, "zhangsan");
//	x.age = 10;
//
//	p = &x;
//
//	p->sex = 'w';
//	strcpy(p->addr, "地球");
//	test(p);
//
//	return 0;
//}

struct date {
	int num;
	int arr[0];
};


int main()
{
	struct date* p = malloc(sizeof(struct date) + 10 * sizeof(int));
	p->num = 10;
	for (int i = 0; i < p->num; i++)
	{
		p->arr[i] = i;
		printf("%d\n", p->arr[i]);
	}
	free(p);
}

18.union:联合体,联合体内所有成员的起始地址都是一样的,每一个都是第一个元素。联合体的大小必须能够整除所有成员的大小。

#define _CRT_SECURE_NO_WARNINGS 1

#include
#include

union un {
	int a;
	char b;
}*p,x;

void test(union un* p)
{
	if (1 == (p->b))
	{
		printf("%s\n", "小端");
	}
	else
	{
		printf("%s\n", "大端");
	}
 
}

int main()
{
	x.a = 1;
	p = &x;
	test(p);

}

19.enum:具有代码的自描述性,列举出具有相关性的常量,可以分段设置常量。

#define _CRT_SECURE_NO_WARNINGS 1

#include
#include

enum color {
	RED,
	BLUE,
	GREEN=5,
	BLACK,
	YELLOW=100
};

int main()
{
	enum color c = RED;
	printf("%d\n", RED);
	printf("%d\n", BLUE);
	printf("%d\n", GREEN);
	printf("%d\n", BLACK);
	printf("%d\n", YELLOW);
	return 0;
}

20.trypedf:类型重命名。(推荐在结构体上使用)

#define _CRT_SECURE_NO_WARNINGS 1

#include
#include

typedef unsigned int u_int;
typedef int* int_p;

typedef struct stu {
	char name[20];
	int age;
	char sex;
}t_stu;

void test(t_stu* p)
{
	printf("%s\n", p->name);
	printf("%d\n", p->age);
	printf("%c\n", p->sex);
}

int main()
{ 
	unsigned int a = 10;

	u_int y = a;
	int_p p = &a;
	t_stu x = { "zhangshan",y,'w' };
	test(&x);
	return 0;
}

扩展:

1.C语言中一共有32个关键字(C89 C90),C99标准有32+5个。

2.在Win中,双击的本质是运行程序,将程序加载到内存中。任何程序在被运行之前都必须被加载到内存中。

3.摩尔定律是英特尔创始人之一戈登·摩尔的经验之谈,其核心内容为:集成电路上可以容纳的晶体管数目在大约每经过18个月便会增加一倍。

4.所有变量在声明时不能设置初始值。

5.解决头文件重复包含的一种方法:#pragma once。 .h头文件的作用:便于项目组织,降低维护成本。

6.C语言中为何要有数据类型:对内存进行合理划分,按需索取。

7.局部变量不做初始化,内容为随机值。

8.命名规则:①见名知意。②大小驼峰。③数字字母下划线。

9.计算机内存储的整形必须是补码,有符号正数和无符号数的原反补码相同,有符号且为负数:原码->(最高位为符号位1不变,其余按位取反)反码->(反码+1,符号位也要参加运算)补码;补码取反再+1,可得到原码。

10.为什么计算机中存储补码:cpu所有计算全部能转换为加法依赖于补码,使得cpu的硬件电路只需要设计一套就够了。

11.C中,0为假,非0为真,C语言中C89,C90标准没有bool类型,C99中有-Bool,在头文件中使用宏的方式定义了bool。bool x=ture/false

12.强制类型转换:不改变内存中的数据,只改变对应的类型。真实转换:会改变内存中的数据。

13.任何C程序在默认编译好之后,运行时都会打开三个输入输出流,stdin:标准输入,FILE*stdin,键盘。stdout:标准输出,FILE*stdout,显示器。stderr:标准错误,FILE*stderr;显示器。键盘输入的内容或者往显示器中打印的内容都是字符。

14.C语言中有字符串,但没有字符串类型。

15.计算机中清空数据,只需要设置该数据无效即可。调用函数形成栈帧,函数返回栈帧结构被释放。(其中数据会被覆盖)临时函数具有临时性的原因:临时变量存放于栈帧之中。

16.指针就是地址,指针变量用于存放地址。地址(指针)的作用:提高查找定位效率。任何一个变量,在不同的应用场景中,代表不同的含义。int x;x=100,左值,代表x的空间,变量的属性。int y=x;右值,代表x的内容,数据的属性。

17.C中,任何函数参数都会形成临时变量,包括指针变量。限定不严格的变量可以赋值给限定严格的变量,反之则不行。

18.取地址操作取的是最低地址,在C中任何变量都是低地址开始(字节序),对指针进行解引用,即为指针所指向的目标(类型相同)。

你可能感兴趣的:(C/C++学习笔记,c语言)