流程控制
C语言中整个程序的流程分为三个结构:
顺序结构、分支结构、循环结构。
循环语句:
goto语句、while语句、do-while语句、for语句
循环语句的构成要素:
1.循环体
2.结束条件
3.使循环趋于结束的操作
4.循环的初始条件
goto语句:严格意义上来说goto语句是跳转语句,不属于循环语句,但通过goto的组合可以达成循环的效果。
while循环语句
while(表达式)
{语句}
先对表达式进行判断,为真再执行语句。为假则结束while循环语句。
do-while循环语句
do{语句}
while{表达式};
先执行语句,再判断表达式,为真则重复执行语句,直到表达式不成立。
注意!在表达式的末尾需要加分号 ‘ ; ’。
for循环语句
for(表达式1;表达式2;表达式3)
{循环体语句}
先求解表达式1,再判断表达式2,为真则执行循环体语句并执行表达式3,接着判断表达式2,以此循环;为假则结束for循环语句。
表达式1可以省略,但作为初始条件,必须存在对应的初始化过程;
表达式2可以省略,但结束条件缺失代表表达式2恒为真,循环为死循环。想要跳出循环需要在循环体语句中加入条件判断语句用于跳出循环。
表达式3可以省略,但作为使循环趋于结束的语句,必须有对应的操作。可以将语句放在循环体语句中起到相应的作用。
三种循环的差异
上面三种循环语句通常可以通用,但各自有适合的场景:
for循环适用于有一定范围的循环;while和do-while循环适用于只有结束条件的循环。下面是针对实现同一个功能使用不同循环的实现方法的区别:
while循环:
//求三位数的水仙花数
int a,b,c;
int i = 100;
while(i <= 999)
{
a = i / 100;
b = (i / 10) % 10;
c = i % 10;
if(i == a*a*a + b*b*b + c*c*c)
{
printf("%d\n",i);
}
++i;
}
for循环:
//求三位数的水仙花数
int a,b,c;
int i;
for(i=100;i<=999;++i)
{
a = i / 100;
b = (i / 10) % 10;
c = i % 10;
if(i == a*a*a + b*b*b + c*c*c)
{
printf("%d\n",i);
}
}
do-while循环:
//记录键盘输入字符个数,直到输入回车
char ch;
int num = 0;
do
{
ch = getchar();
++num;
}
while(ch != '\n');
printf("num = %d\n",num);
循环控制语句:
break语句、continue语句
break语句
用于switch语句和循环语句中,不能用于goto语句中。
在循环中使用表示跳出当前层次循环。
continue语句
只能用于循环语句中。
在循环语句中表示结束本次循环,继续下一次循环。
数组
数组是一组相同类型数据或变量的集合,也是一种属于构造类型的数据类型。
类型说明符 数组名[常量表达式]
int array[10];
类型说明符说明了数组的数据类型,包括整型(int、short、long、long long)、浮点型(float、double、long double)和字符型(char)。
数组名说明了数组的名称,作为标识符代表数组。
常量表达式说明数组的长度 ,表示数组中的元素个数。在定义时可以使用变量但在使用变量最为常量表达式时不能对数组初始化。在定义时也可以省略常量表达式,编译器可以根据初始值计算数组长度。
int n = 3;
int array[n] = {0,1,2};
int array[] = {0,1,2};
数组给值通过初始化和赋值进行。
可以全部初始化、部分初始化或者不初始化。部分初始化和不初始化时,数组没有被初始化的部分自动初始化为零。
int array[3] = {1,2,3};
int array[3] = {1,2}; <=====> int array[3] = {1,2,3};
int array[3] = {} <=====> int array[3] = {0};
赋值通过循环赋值的方法从键盘或其他空间对数组进行赋值。
for(i = 0;i < 5; ++i)
{
scanf("%d",&array[i]);
}
数组中的[ ]表示数组下标运算,其中的数值为偏移量,表示相对数组名偏移了几个元素,偏移量为0表示没有发生偏移。
如果偏移量大于数组长度,会发生数组越界,此时从内存空间读取到的数值不属于数组。
int array[10] = {0,1,2,3,4,5,6,7,8,9};
x = array[20]; //数组越界