c语言-关键字

2024-01-01 07:32:59

c语言中共有关键字32个,了解即可之后也会讲到,并且在之后使用过程中会越来越熟练

一、存储单位

计算机存储的是二进制,一位二进制能存放0或1(表示关或开,低电平和高电平)

1字节=8bit(也就是8位二进制位)0000 0000~1111 1111

1B=8b

1KB=1024B

1MB=1024KB

1GB=1024MB

1TB=1024GB

1PB=1024TB

1EB=1024PB

........

(10.24是程序员节哦!!)

二、关键字

1.数值类型(12个)

数据的不同类型是为了合理利用空间

1)在32位平台:

char字符型:1字节(8位)

short短整型:2字节(16位)

int整型:4字节(32位)

long长整型:4字节(32位)

longlong长长整型:8字节(64位)但是这个有的开发环境有有的没有(vc++6.0,vs2010中不能用)

float单精度浮点型:4字节(32位)

double双精度浮点型:8字节(64位)

2)在64位平台

只有long是8字节(64位)发生变化

3)可以用sizeof测量类型的长度

#include<stdio.h>
int main(int argc,char *argv[]){
printf("sizeof(char) = %d\n",sizeof(char));
printf("sizeof(short) = %d\n",sizeof(short));
printf("sizeof(int) = %d\n",sizeof(int));
printf("sizeof(long) = %d\n",sizeof(long));
printf("sizeof(float) = %d\n",sizeof(float));
printf("sizeof(double) = %d\n",sizeof(double));
while(1);
return 0;
}

运行结果:

79733cf6042641f39537a0cfa6a76456.png

4)unsigned与signed

unsigned无符号数:

数据没有符号位,全是数值

unsigned char a;1字节就是0000 0000~1111 1111

signed有符号数:

默认就是有符号,可以省略

二进制最高位是符号位,其余为数值位 ?signed char a;1字节就是xxxx xxxx(x表示0~1)

signed char a;1字节就是xxxx xxxx(x表示0~1)

?最高位为1表示负数(1xxx xxxx)最高位为0表示正数(0xxx xxxx)

?范围:1111 1111~1000 0000~0000 0000~0111 1111

?char型的-10改为二进制为1000 1010(现阶段可以win+R写calc调出程序员计算机进行计算,之后会讲到如何进行换算)

#include<stdio.h>
int main(int argc,char *argv[]){
signed int num1 = 10;//有符号数
int num2 = 10;//虽然没写signed,但是默认有符号
unsigned int num3 = 10;//无符号数
while(1);
return 0;
}

这个代码没有输出哦

5)struct与union

?struct是结构体,其中成员拥有独立空间

struct data1{
char a;
short b:
int c;
};

示意图大体是这样,但是这并不是详细的存储结构,只做示意

c49e9a384709408282a5a534a3725312.png

union是共用体,其中成员共用一份空间

union data2{
char a;
short b:
int c;
};

c2441ff6d66746afaf54ac0894fed571.png

6)enum

枚举类型,将变量一一列出

c语言没有布尔值

可以自己造一个:

#include<stdio.h>
int main(int argc,char *argv[]){
	enum BOOL{false,true};
	//这个地方false和true标红是因为这里实质上使用的是c++
	//而c++中是存在布尔类型的也就是bool以及false和true都是它的关键字
	enum BOOL bool = false;
	//这个bool也会报错,从下方bool的报错中就可以看出bool实质是已有的类型名
	printf("bool=%d",bool);//这个地方由于是false所以是0
while(1);
return 0;
}

报错:

3fbe9ca03d674f3d9695788ea647808e.png

原因上面代码中解释了

7)void

无类型,就字面意思

注意不能用void定义变量

因为系统根据变量前的数据类型来申请空间,无类型这样系统不知道要申请多少空间就会报错

2.控制语句(12个)

if,else,switch,case,default(选择)

for,do,while,break,continue,goto,return(循环)

3.存储类关键字(5个)

auto自动:在c中不咋用,Java中可以根据赋值自动推测数据类型

const只读变量,entern外部可用,static静态,

register寄存器:

当一个在内存中的数据使用得非常频繁,系统会自动将它放到寄存器中,从寄存器中读取数据的速度比内存中快得多

使用register可以人为的要求系统尽量将某个数据放到寄存器中,但是如果寄存器满了,那也还是放不进去

3a8f019ca8bd4c15b6c16bf5a0b5a58d.png

当然,内存和cpu之间也是有各级缓存的,图中没有表示出来

register int data=10;//人为的尽量将data放入寄存器中
printf("%p\n",&data);//不对,不能对寄存器变量取地址

系统将数据从内存中拿到寄存器中,我们通常说的取地址是取内存地址

%p是地址的输出占位符

4.其他(3个)

sizeof测量类型大小

typedef为已有类型取别名:便于代码的移植

#include<stdio.h>
typedef int INT32;
int main(int argc,char *argv[]){
 int num1 = 10;
 INT32 num2 = 20;
 printf("num1 = %d\n",num1);
 printf("num2 = %d\n",num2);
while(1);
return 0;
}

运行结果:
c916bcbc0c884d2bab61c075091458b7.png

volatile防止编译器优化,强制访问内存操作:

适用于要时刻访问的数据(底层驱动会大量用到这个关键字)

volatile int value;

af2b47508c9b4fb7957c2c3dd3ab4ea4.png

比如说监测有毒气体,这个设备会实时监测数据,data也就经常使用,就前面所说的,如此频繁使用,系统就会将data放入寄存器中,每次取数值都从寄存器中取,但是data可是实时变化的

假如我把data拿到寄存器中的时候有害气体是10%非常安全,在很短的时间内,data有害气体变成了90%,然而你寄存器中还是之前的10%,就会导致大问题发生

?

?

?

?

文章来源:https://blog.csdn.net/m0_73885339/article/details/135181569
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。