目录
while、do…while、for、continue、break
前言
这里只是对于一些C语言常见关键字的一些用法的演示或者比较简单的含义,当你看完这个之后,对于C语言常见的关键字的作用和用法肯定有所理解。如果有任何问题欢迎各位在下方或者私信交流。
想知道更多的细节可以去访问这个==》cppreference.com
本文所用到的代码集合==》C 语言关键字
关键字:
- C语言自己预留的特殊符号,有特殊的意义。
- 关键字不能自己创造,也不能做变量名。
auto
auto声明为自动变量 函数内部定义使用的变量
个人理解:可以把它理解成局部变量的作用域,随着{的创建而自动生成,随着}而消失
int main()
{//auto int a =10;
int a = 10;//a局部变量出了{}自动销毁 进出{}自动创建-->自动变量 前面会有个auto省略掉了
return 0;
}
signed、unsigned
signed:有符号类型的整数类型
- 使用在整数类型的前面
- 在整数类型的时候默认有符号,所以一般来说使用的频率不高。
- 有符号就代表着其有正负之分。
int main() { signed int a = 10; signed long b = 10; signed short c = 10; return 0; }
unsigned:无符号类型的整数类型
- 使用在整数类型的前面
- 在整数类型前面用unsigned的时候,表示其只有正数
int main()
{
unsigned int a = 1;
unsigned long b = 1;
unsigned short c = 1;
return 0;
}
总结:
- signed是默认的 ,表示这个变量是有符号的, 所以是可以存储整数和负数。
- unsigned需要给出,表示这个变量没有符号值能存储数的大小,而不能表示正负。
- signed存储符号是有代价的,代价就是存储空间中的一个比特位,专门用来存储符号,这一位不能表示数值。
- 一般来说 ,同类型的signed能够存储的数的绝对值大小要小于unsigned。
sizeof
sizeof是操作符,计算变量/类型/数组所占空间的大小 单位是字节(byte)
int main()//sizeof
{
int a = 4;
int arr[] = { 1,2,3,4,5,6 };//数组类型里的每个元素是int
printf("%d\n", sizeof(a));//4
printf("%d\n", sizeof(char));//1
printf("%d\n", sizeof(int));//4
printf("%d\n", sizeof(arr));//24
return 0;
}
arr因为是数组,里面有6个元素,然后6有个元素的类型是int==》6×4=24.
char
char是C语言的基本数据类型——字符型。大小是一个字节。
注意:
- 字符是以ASCII码存在内存里面的。
范围:
- signed char: -2^7 ~ 2^7 - 1
- unsigned char : 0 ~ 2^8 - 1
int main()
{
char a = 'A';
printf("%d\n", sizeof(char));//1
printf("%c", a);//A
}
short
short是C语言的基本数据类型——短整型。大小是两个字节。
注意:赋值的时候记得不要超过short的大小。
范围:
- signed:-32768~+32767
- unsigned :0~65535
int main()
{
short a = 10;
printf("%d\n", sizeof(short));//2
a = 32768;
printf("%d\n", a);//-32786
unsigned short b = 65538;
printf("%d", b);//2
}//并没有正确打印出来
int
int是是C语言的基本数据类型——整型,大小是四个字节
注意:赋值的时候记得不要超过int的大小。
范围:
- signed:-2,147,483,648~2,147,483,647
- unsigned:0~4,294,967,295
int main()
{
int a = 10;
printf("%d\n", sizeof(int));//4
printf("%d\n", a);//10
a = 1000000000000;
printf("%d", a);//-727379968 超过其范围
return 0;
}
long
long是是C语言的基本数据类型——长整型,大小是四个字节(有的编辑器可能是8个字节)
注意:赋值的时候记得不要超过long的大小。long在C语言规定里是起码大于int,long>=int。
范围:
- signed:-2,147,483,648~2,147,483,647
- unsigned:0~4,294,967,295
int main()
{
long a = 10;
printf("%d\n", sizeof(long));//4
printf("%d\n", a);//10
a = 1000000000000;
printf("%d", a);//-727379968 超过其范围
return 0;
}
float
float是是C语言的基本数据类型——单精度浮点数(小数),大小是四个字节。
范围:-3.4x10^-38 ~ 3.4x10^38
注:float和double不存在unsigend。
int main()
{
float a = 1.1;
printf("%f\n", a);//1.100000
printf("%d", sizeof(float));//4
return 0;
}
double
double是是C语言的基本数据类型——双精度浮点数(小数),大小是八个字节。
范围:-1.7x10^308 ~ 1.7x10^308
注:float和double不存在unsigend。
int main()
{
float a = 12.1;
printf("%lf\n", a);//12.100000
printf("%d", sizeof(double));//8
return 0;
}
struct
- struct是结构体关键字。
- 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
struct tag struct:结构体关键字 tag:标签 {//例如 char name[20]; char tele[12]; //成员变量 变量列表 }variable - list;//成员列表 PS:这里;不能掉
struct student { char SEX[20]; char NAME[20]; int year; }A; int main() { struct student A = { "男","hunter",21 }; printf("%s\n", A.SEX);//男 printf("%s\n", A.NAME);//hunter printf("%d", A.year);//21 return 0; }
union(共用体)
- 定义:联合也是一种特殊的自定义类型这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
- 特点:联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。
union Un
{
char c;
int i;
};
int main()
{
union Un u;
printf("%d\n", sizeof(u));//4
printf("%p\n", &u);//00000034F18FFA94
printf("%p\n", &(u.c));//00000034F18FFA94
printf("%p\n", &(u.i));//00000034F18FFA94
return 0;
}
struct和union的区别:
- struct:内存空间是所有结构体成员,内存空间是等于所有成员长度的和。
- union:所有成员共用一块内存空间,成员不能同时占用内存空间,内存空间长度是最长成员长度。
enum
PS:对于enum本人对其的理解不深,怕误人子弟就不给各位写文字内容了,就贴上代码形式,感兴趣各位老铁自行搜索。
enum Sex
{
//枚举的可能取值-常量
MALE, //0
FEMALE, //1
SECRET,//2 没有赋值的情况默认从0开始
};
int main()
{
enum Sex s = MALE;
printf("%d", s);//0
return 0;
}
typedef
typedef类型定义-类型重定义 相当于起别名。
例如:你的大名叫张三,你也有小名:狗蛋。张三和狗蛋指的是一个人。
下面给int起了个“小名”——>I。
int main()//typedef
{
typedef int I;
I num = 20;
printf("%d", num);//20 正常输出
return 0;
}
switch、case、default、break
语法结构:
switch (整形表达式)
{
//case 整形表达式:
语句项;
}
- switch:是选择语句。
- case:是看着switch旁边()的整形表达式的结果进行选择的,只有对上了case的序号,case后面的语句才会实现,如果没有case匹配的上且没有default,句子就会直接跳出switch语句,执行switch后面的语句。(case语句后面的序号可以随便写,可以不用按照顺序)
- default:当switch的判断条件没有一个匹配case,就会触发。
- break:用在switch语句和循环语句(for、while、do……while)里面,用于跳出switch语句和循环语句。如果匹配上了case,且当前case语句没有break句子就会顺着往下面执行,直到没有case语句或者在后面的case语句里面碰到了break。
int main()//switch语句
{//如果都是相同类case内容 相同的就可以删除printf、break,直至最后一个
int day = 0;
scanf("%d", &day);
switch (day)// switch(整型表达式)
{//case 是入口 break是出口
case 1:
printf("1\n");
break;
case 2:
printf("2\n");
break;
case 3:
printf("3\n");
break;
case 4:
printf("4\n");
break;
default://输入的常量 前面都未匹配上就会到default default和case没有严格的顺序控制
printf("输入错误\n");
}
return 0;
}
if语句
注意:
- if语句后面不能有 ;(分号),否则后面的if语句后面表达式不管是为真还是为假都会执行。
- 如果表达式结果为真,则语句执行(0为假,一切非0为真)
- if和else如果要控制多条语句要用{}括起来
- 没有执行成功的if后面一行的代码都不会被执行
- else和里的最近的未匹配的if相匹配
语法结构:
if (表达式)
语句;
//--------------
if (表达式)
语句1;
else
语句2;
//-----------
//多分支
if (表达式1)
语句1;
else if (表达式2)
语句2;
else
语句3;
int main()
{// 例 int a = 9; (10<=a<28)-->(10<=9<28)-->(9不是<10,为假为0)(0<28)-->成立选择
int age = 140;
if (age >= 18 && age < 28)
printf("青年\n");
else
{
if (age >= 28 && age < 60)
printf("壮年\n");
else if (age >= 60 && age < 80)
printf("老年\n");
else
printf("高人\n");
}
return 0;
}
int main()
{//else和里的最近的未匹配的if相匹配
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;//结果啥也没有 上面a=0 a==1 不匹配,直接就不进入
}// 如果想让与之匹配 就在if(a==1){}给个大括号else
goto语句
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。 从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。 但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
例如:一次跳出两层或多层循环。 多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
PS:下面代码慎用。执行到goto语句这里会跳转到again:处。
int main()//goto语句
{
char input[20] = { 0 };
system("shutdown -s -t 60");
again:
printf("请注意,你的电脑将在1分钟内关机,如果输入:我是猪,就取消关机:>\n");
printf("请输入:>");
scanf("%s", input);
if (strcmp(input, "我是猪") == 0)
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
while、do…while、for、continue、break
- break其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
- continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到语句的判断部分。进行下一次循环的入口判断。
- break和continue循环语句(while、do…while、for)都适用,效果也都一样
- break也能用于switch语句中,continue不能用于switch语句中
while语法结构与规则:注意要写跳出程序的功能,不然容易死循环。
while (表达式)
{
循环语句;
}
int main()
{
int a = 1;
while (a <= 10)
{//打印1-10的数字
if (a == 5)
//break;//这边停止 1 2 3 4
continue;//终止本次循环后面的代码不在执行 直接进入到while循环的判断部分
printf("%d\n", a);//1 2 3 4 _ 这边一直有光标在闪 在a++;a=5后while成立,进入if判断相等,就会continue直接while a=5
a++;
}
return 0;
}
do…while语法结构与规则: 代码至少执行一遍,然后再进入while表达式进行判断,注意要写跳出程序的功能
do
{
循环语句;
} while (表达式);
int main()// do ...while 循环
{
int i = 1;
do
{
if (i == 5)
//break;
continue;//跟while情况类似
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
for语法结构与规则:
- 表达式1为初始化部分,用于初始化循环变量的。
- 表达式2为条件判断部分,用于判断循环时候终止。
- 表达式3为调整部分,用于循环条件的调整。
执行顺序:exp1->exp2->循环语句->exp3
for(表达式1; 表达式2; 表达式3)
循环语句;
int main()//for循环 打印1-10的数字
{
int i = 0;
//初始化; 判断 ; 调整
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
return
return语法格式与规则:
- return 语句可以有多个,可以出现在函数体的任意位置,但是每次调用函数只能有一个 return 语句被执行,所以只有一个返回值。
- 函数一旦遇到 return 语句就立即返回,后面的所有语句都不会被执行到了。
return 表达式;
或者:
return (表达式);
int Max(int a, int b)
{
if (a > b)
return a;
else
return b;
}
int main()
{
int MAX=0, b=20, a = 10;
MAX= Max(a, b);
printf("%d", MAX);//20
return 0;
}
extern
static
- static 修饰局部变量增加声明周期 修饰全局变量 减少作用域
- 修饰全局变量 减少作用域 让静态的全局变量只能在自己所在的源文件内部使用 出了源文件则无法使用。
- 修饰函数 改变了函数的链接属性(改变为内部链接属性) 函数有外部链接属性
static int Add(int x, int y)
{
int z = x + y;
return z;
}//在另外一个新的.C文件的代码
extern int Add(int, int);
int main()
{
int a = 10;
int b = 20;
int sum = 0;
sum = Add(a, b);
printf("sum=%d\n", sum);
return 0;
}
static int g_val = 2020;
int main()//static 改变全局变量的作用域 减少
{//extern 声明外部符号的
extern int g_val;
printf("%d\n", g_val);
return 0;
}
void test()
{
static int a = 1;
a++;
printf("a=%d\n", a);
}
int main()//static 修饰局部变量
{//static局部变量的生命周期便长
int i = 0;
while (i < 5)
{
test();
i++;
}
return 0;
}
register
register: 寄存器变量 寄存器的读写速度高于内存 用经常使用的变量给定义
int main()
{
register int a = 10;//建议把a定义成寄存器变量 最终的决定权还是在编译器手中
printf("%d", a);
return 0;
}
后语
希望这篇文章对各位有所帮助,能对C语言的关键字有所认识。如果可以的话,希望各位老铁多点点赞,给给鼓励,咱们下篇文章见。