一、开关语句
1、switch小括号中的数据可以是变量或表达式,但结果必须是整数型,case后面的数据必须是整数型常量。
2、把switch小括号中的数据与case后的数据进行对比,如果相同则打开执行开关。
3、当执行开关处于打开状态时,case后面的语句就会被执行,如果执行开关不关闭,之后case、 default后面的语句也会被执行。
4、break语句可以关闭执行开关,如果每个case后都break语句,就形成了多分支结构。
5、default无论写在任何位置,都是等所有的case没有匹配成功后,才打开执行开开关,就相当于多 分支if语句最后的else,可以有也可以没
switch (数据)
{
case v1: 语句1; break;
case v2: 语句2; break;
case v3: 语句3; break;
...
default: 语句; break;
}
gnu编译器的专用语法:
switch(整型数据)
{
case start1 ... end1: 语句1; break;
case start2 ... end2: 语句2; break;
case start3 ... end3: 语句3; break;
}
二、for循环语句
通过反复执行一段代码,达到解决问题的目的,for是一种非常灵活的循环,一般都使用一个变量来引 导它的执行过程,这个变量被称为循环变量,早期使用index作为循环变量名,然后逐渐演变成i,如果 有多个循环也可以使用j、k、l。
for([1]; [2]; [3])
{
[4];
}
1、为for循环做一些准备工作,定义循环变量、给循环变量赋初值,C89的语法标准下不能定义变量,
在此处定义的变量和出了for循环就不能再使用。
2、判断循环条件,条件为真执行4,条件为假结束for循环,如果没有语句,则默认为真
4、被反复执行的代码也叫循环体
3、改循环条件,循环变量自加或自减1,防止变成死循环
循环流程:
1 2 4 3 2 4 3 2 4 3 ... 2
for循环的不同写法:
for(;;) // 死循环
{
...
}
int i=0;
for(; i<10; i++)
{
...
}
int i=0;
for(; i<10;)
{
...
i++;
}
for(int i=0; i<10; i++,...);
三、while循环语句
while(循环条件)
{
// 循环体
}
执行流程:先检查循环条件,为真则执行循环体,为假则结束while循环。 如果for循环语句忽略模块1和模块3功能与while一模一样,它相当于for循环的精简版本,for适合解 决循环次数明确的问题,while适合解决只知道循环条件,但不确定具体的循环次数的问题
四、do while循环语句
do {
// 循环体
}while(循环条件);
执行流程:先执行循环体,再判断循环条件,当条件为真时继续执行循环体,当条件为假时结束循 环。 无论条件真假,循环体至少执行一次,相同条件下,它会比for和while多执行一次循环体。 注意:在 do while 循环体中定义的变量,不能在小括号中使用,类似for循环中定义的循环变量,出了大括号也不能使用。
循环嵌套:
循环语句中包含循环语句,外层循环执行一次,内层循环执行一遍。
for(int i=0; i<10; i++)
{
for(int j=0; j<10; j++)
{
printf("*");
}
printf("%d\n",i);
}
五、跳转语句
break跳转语句:
两种用法: 用法1:在 switch 语句中可以关闭执行开关。
用法2:在循环语句中,它可以跳出一层循环,也是结束死循环的一种方式,一般用它来提前结束 循环,提高程序的执行效率。
#include <stdio.h>
int main()
{
int i = 0;
for(;;)
{
if(i>=10)
break;
printf("%d\n",i++);
}
}
continue语句:
只能在循环语句中使用,停止本次循环体的执行,直接进行下一次循环,一般用于改善大括号的嵌套 层数。
#include <stdio.h>
int main()
{
for(int i=0; i<10; i++)
{
if(i%2)
continue;
printf("%d\n",i++);
}
}
goto语句:
goto 语句可以跳转到函数内的任意位置,由于它过度灵活、自由可能会破坏已经设计好的分支、循环 语句,因此一般公司都禁止使用,新的编程语句中已经取消该关键字。
goto非常适合在驱动程序中处理异常、释放资源,所以C语言中从语法设计上就非常适合控制硬件。 在函数内通过定义标签确定代码位置。
#include <stdio.h>
int main()
{
int i = 0;
goto line3; // 跳转到某个位置标签
// 定义位置标签
line1:
printf("1\n");
line2:
printf("2\n");
line3:
printf("3\n");
line4:
printf("4\n");
line5:
printf("5\n");
}
return语句:
return 语句可以跳出函数,并附加一个数据给函数的调用者。
#include <stdio.h>
int main()
{
for(int i=0; i<10; i++)
{
if(5 == i)
return 0;
printf("%d\n",i);
}
printf("over!\n");
}
六、数组
什么是数组: 数组就是变量的组合,是一种批量定义变量的方式。
如果定义数组:
类型 数组名[数量];
int arr[8]; 就相当于定义了8个变量 int b1,b2,b3,b4,b5,b6,b7,b8;
访问数组中的变量:
数组名[下标];
下标就是变量的编号,下标的范围:0 , 数量-1
遍历数组:
与for循环配合,使用循环变量作为数组的下标。
int arr[8];
for(int i=0; i<8; i++)
{
printf("%d ",arr[i]);
}
数组的初始化:
数组元素的默认值与普通变量一样,是随机的,如果需要对数组初始化可以使用以下语法。 类型 数组名[数量] = {v1,v2,v3,...};
1、如果初始化数据不够,编译器会自动补0。
2、如果初始化数据过多,编译器会提示警告并丢弃多余数据。
3、对数组进行初始化时,数组的数量可以省略,编译器会自动统计数据的数量设置给数组。
4、初始化语法只能在定义数组时使用,这也是唯一一次能对数组批量访问的机会,数组定义完成后就 只能单个访问。
int arr[] = {1,3,1,2,1,3,2,5,3,5,2,3,6,3};
int len = sizeof(arr)/sizeof(arr[0]);
for(int i=0; i<len;i++)
{
printf("%d",arr[i]);
}
数组越界:
使用非法的下标访问数组的行为叫数组越界,当数组越界访问时编译器不会报错,因为使用变量作为 数组的下标时,编译器无法检测到数组越界的(程序不运行变量的值无法确定)所以就不再检查数组的 下标是否合法,这样做的好处就是代码的编译、运行速度快。
数据越界的后果:
1、运气好的情况下,会一切正常。
2、段错误,操作系统发现程序非法访问内存,它就会把程序杀死。
3、脏数据,数组越界访问到其它数组、变量的内存位置,破坏了其它数组、变量的数据。