c语言共有32个关键字,下面详细介绍各个关键字及其使用方法
32个关键字分类
1、数据类型关键字(12个)
char、short、int、long、signed、unsigned、float、double、
struct、union、enum、void
2、控制语句关键字(12个)
循环控制:for、do、while、break、continue
条件语句:if、else、goto
开关语句:switch、case、default
返回语句:return
3、存储类型关键字(5个)
auto、extern、register、static、typedef
4、其它关键字(3个)
const、sizeof、volatile
下面详细介绍一下不同类型的关键字及其使用方法
关键字:声明类型或使用场景(开辟内存空间大小/注意事项)
1、存储类型关键字
char:声明字符型变量或函数(1字节)
字符型变量,顾名思义是用来声明字符类型的及通过单引号括起来的;
c语音中单引号用来表示字符型量;双引号用来表示字符串
下面是几个char关键字的例子
//程序
char a = 'a';
char b = "a";
char bb[] = "a";
char c = 1;
char d = 12345;
char e = 'abcd';
char f = 'abcde';
printf("a:%c\n",a);
printf("b:%c\n",b);
printf("bb:%s\n",bb);
printf("c:%d\n",c);
printf("d:%d\n",d);
printf("e:%c\n",e);
printf("f:%c\n",f);
//结果
a:a
b:$
c:1
d:57
e:d
f报错
可以看出char关键字定义字符型变量(a)时可以输出正确结果,而双引号为字符串,需要定义char类型的数组进行数据存储(bb)。
char也可以定义整形数据(c),而char的取值范围是有限的无符号类型为(0~255),有符号类型为(-128~127),所以当数值超出范围就会溢出,只保存未溢出的部分(d)。
字符型变量(e)写4个字节不报错而写大于4个字节就会报错,且小于4字节结果却输出最后一个字符的原因是“整形提升”,一般寄存器都是32位的,开辟小于32位的类型空间时只填满低8位,而高24为也开辟了,只不过未使用,所以如果你定义了4个字节的数据,就会把高24位填满,而显示只能显示低8为数据,而超出4字节就会出现内存空间不足而报错的问题。
char有三种不同的类型:单纯char、signed char、unsigned char。signed char和unsigned char 类型是用来声明数值的;单纯char类型是真正的字符类型,使用了声明字符的。
int: 声明整形变量或函数(2/4字节)
shot:声明短整形变量或函数(2字节)
long:声明长整形变量或函数(4/8字节)
long long :通常为64位整数,提供最大范围
unsigned:声明无符号类型变量或函数
一元负号运算(-)运算不能使用在unsigned表达式内。
signed:声明有符号类型变量或函数
int或long数据类型是对应字节空间大小取决于编译器和操作系统,是由硬件所决定的,也就是你的电脑是32位还是64位系统。
short a = 1;//短整形,取值范围为signed short(-32768~32767)
// unsigned short(0~65535)
int b = 1;//整形,取值范围为signed int(-2147483648~2147483647)
// unsigned short(0~4294967295)
long c = 1;
long long d = 1;
unsigned int e = 1;
signed int f = -1;
任何数据在计算机中都必须转换为二进制。保存到内存中的数据是二进制数据的补码形式。
有符号数二进制表示形式为:符号位+数据位
有符号正数:源码 = 反码 = 补码
有符号负数:反码 = 在源码的基础上,符号位不变,其它位按位取反
补码 = 反码+1;
补码转换为源码的方式:
1、先减一,然后符号位不变,其它位按位取反
2、先符号位不变,其它位按位取反,再加一(在进行一次源码转补码操作)
float:声明浮点型变量或函数(4字节)
double:声明双精度变量或函数(8字节)
float a = 1;
float b = 1.2;
float c = 1.23456789;
double d = 1;
double e = 1.2;
double f = 1.23456789;
printf("a = %f\n", a);
printf("a = %.1f\n", a);//保留小数点后1位(.1f)
printf("b = %f\n", b);
printf("b = %.3f\n", b);//保留小数点后3位(.3f)
printf("c = %f\n", c);
printf("cc = %.8f\n", c);//保留小数点后8位(.8f)
printf("d = %f\n", d);
printf("e = %f\n", e);
printf("f = %f\n", f);
printf("f = %.8f\n", f);//保留小数点后8位(.8f)
结果:
a = 1.000000
a = 1.0
b = 1.200000
b = 1.200
c = 1.234568
cc = 1.23456788//?超出了取值范围(不确定)
d = 1.000000
e = 1.200000
f = 1.234568
f = 1.23456789
%f默认保留6位小数,不足位以0补齐,超过六位按四舍五入的方法保留6位,若想输出指定位数,在格式化输出语句中表示变量的字母及%中间的部分控制输出位数,小数点后是小数位数。
void:声明函数无返回值或无参数,声明无类型指针
void不能定义变量,空类型不知道开辟多少空间
void本身就被编译器解释为空类型,强制的不允许定义变量
c语言中,函数可以没有返回值,默认返回值是int类型
void修饰函数时的作用:1、占位符,让用户明确,不需要返回值
2、告知编译器,返回值无法接收,即进行报错告警
指针未学到,但是保留空白
void*:void和指针结合使用
无类型指针,也称为空指针,可以指向任何类型的数据
注意:当我们需要使用void类型的指针变量去指向某一类型的1变量的时候,必须要对其进行类型转换
//方法一:
int *p1;
void *p2;
p1 = p2;
//方法二:
int *p1;
void *p2;
p1 = (int*)p2;
如果函数的参数可以是任意类型指针,那么应声明其参数为void *
void show(void *num)
{
}
void *用来设计通用接口
例如,memset()函数:初始化内存空间
enum:声明枚举类型
定义方式:enum 枚举类型名 {枚举值列表};
#include<stdio.h>
enum color {
red,
green,
blue = 4,
black,
yellow=9,
pink
};
int main()
{
printf("%2d,%2d,%2d,%2d,%2d,%2d\n", red,green,blue,black,yellow,pink);
}
结果:
0, 1, 4, 5, 9,10
请按任意键继续. . .
枚举的意义:具有自我描述性(对程序员来讲)
#include <stdio.h>
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
int main()
{
// 遍历枚举元素
for (day = MON; day <= SUN; day++) {
printf("枚举元素:%d \n", day);
}
}
struct:声明结构体变量
结构体试讲一下零散的数据类型打包在一起,形成一个整体,来修饰一个大类,例如学生这个大类可以通到姓名(char)、年龄(int)、学号(char)、性别(char)等不同的数据类型进行修饰
#include<stdio.h>
struct str {
char name[20];
int age;
char id[30];
char sex[10];
}a;
int main()
{
a.age = 12;
strcpy(a.name, "XiaoLan");//数组也不能直接等号赋值,需要用strcpy函数拷贝
printf("%d\n", a.age);
printf("%s\n", a.name);
struct str w;
//w.name = "XiaoMing";//报错
strcpy(w.name, "XiaoMing");//数组也不能直接等号赋值,需要用strcpy函数拷贝
w.age = 10;
printf("%d\n", w.age);
printf("%s\n", w.name);
return 0;
}
//结果为:
12
XiaoLan
10
XiaoMing
请按任意键继续. . .
注意:结构体只能整体初始化,不能整体赋值
union:声明共用体类型
共用体开辟空间的大小一定要可以整除至少一个变量的大小,且大于等于所有变量中开辟空间最大的那个变量所开辟的空间。
#include<stdio.h>
union Un//联合类型的声明,union是联合体关键字
{
char c;//1字节
int i;//4字节
};
int main()
{
union Un u;
printf("%d\n",sizeof(u));
}
//结果为:
4
联合体(共用体)共用同一个开辟空间,而读取是就需要考虑是大小端问题了。联合体定义的两个变量的开始地址是相同的,也就是上面所述的c和i变量的开始地址是一样的。
小测试
int main()
{
signed char a[1000];
int i;
for(i = 0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}
答案是:255。计算机在存储数据时是保存数据的二进制补码形式,所以通过观察补码的变换形式来获取答案,strlen
函数遇见\0结束,所以到0就是最后的结果。
后续内容见下一篇博文。