目录
4.3 do while循环中的break和continue
C语言提供了三种循环语句,分别是for循环、while循环及do while循环语句。下面介绍第一种循环for循环语句。
1.for循环
1.1 基本语法
for循环是一种最常用的循环,for循环的基本语法格式如下:
for(表达式1;表达式2;表达式3)
{
语句;
}
说明:
表达式1:循环变量的初始化;
表达式2:循环结束条件的判断;
表达式3:每次调整循环变量。
1.2 for循环的执行流程
执行顺序为:先执行表达式1对变量进行初始化,再执行表达式2判断条件,表达式2的结果 == 0,则直接结束循环;表达式2的结果 != 0,则执行循环语句,执行完成后执行表达式3调整变量,再继续执行表达式2判断结果是否为0,决定是否进行下一次循环。
1.3 练习
练习1:需求:计算1~100之和。
#include <stdio.h>
int main()
{
int sum = 0;
int i = 0;
for (i = 0; i <= 100; i++)
{
sum += i;
}
printf("%d\n", sum);
return 0;
}
练习2:需求:计算1~100之间能被5整除的数字之和
//优化之后的
#include <stdio.h>
int main()
{
int sum = 0;
int i = 0;
for (i = 5; i <= 100; i+=5)
{
sum += i;
}
printf("%d\n", sum);
return 0;
}
//不优化
#include <stdio.h>
int main()
{
int sum = 0;
int i = 0;
for (i = 1; i <= 100; i++)
{
if(i % 5 == 0)
sum += i;
}
printf("%d\n", sum);
return 0;
}
2.while循环
2.1 while循环基本结构
while(表达式)
{
执行语句;
}
例如:用while语句写一个循环,下列示例中while表达式不为0,则死循环打印"hello world"。
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while (n != 0)
{
printf("hello world\n");//while后的表达式不为0,则死循环打印hello world
}
return 0;
}
2.2 while语句的执行流程
程序开始执行时,首先判断while的表达式是否成立,表达式的结果不为0,则执循环语句,执行完本次循环再继续判断表达式,是否继续进行下一次循环;如果表达式的结果为0,则循环直接结束。
2.3 while循环的练习
需求:打印1~100的偶数。(这里终止条件为 i < 100的原因是,条件表达式的执行次数总是比循环体的执行次数多一次,所以如果终止条件为 i <=100 ,则输出结果会多打印一个数据 102).
#include <stdio.h>
int main()
{
int i = 0;
while (i < 100)
{
i += 2;
printf("%d ", i);
}
return 0;
}
小练一下:
输入一个正整数,逆序打印这个整数的每一位
例如:
输入:1234,输出 4 3 2 1
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
while (num != 0)
{
printf("%d ", num % 10);
num = num / 10;
}
return 0;
}
3.do while循环
3.1 基本格式
循环语句的使用中do while相对前两种循环,使用较少。它的语法格式如下:
do
{
语句;
}while(表达式);
do while循环和for循环及while循环的区别:while循环和for循环都是先判断条件是否成立,如果成立则进入循环,执行循环语句,否则跳出循环。
而do while循环则先执行循环体,再判断while后的条件是否成立,表示式为真,则进行下一次循环,表达式为假,就跳出循环。
3.2 do while循环的执行流程
在do while 循环中先执行循环体,执行完循环体之后,再去“判断表达式” ,表达式的结果不为0,则继续执行循环体;判断表达式的结果为0,则结束循环。
do while循环的特殊在于语句中的循环至少会执行一次。
3.3 do while循环的实例
需求:打印1~100的值。
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i += 1;
} while (i <= 100);
return 0;
}
实际生活中,循环体至少被执行一次的场景比较少,所以do while循环不常使用。
小试牛刀:
需求:输入一个正整数,判断这个整数是由几位数字组成?
例如:输入:321 输出:4
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
int count = 0;
do
{
num = num / 10;
count++;
} while (num != 0);
printf("%d\n", count);
return 0;
}
说明:这里并非只能使用 do while 语句,但这个场景使用do while循环更适合一些,因为即使输入0,也是1位数,要统计到位数中。
4.break语句和continue语句
执行循环的过程中,如果遇到某个状况,需要提前终止循环的场景非常常见。C语言提供了 break 和 continue 两个关键字,和循环配合使用。
- break 的作用为永久的终止循环,只要执行到break语句,直接跳出循环结构,继续执行循环后面的语句。
- continue 的作用为跳过本次循环,继续执行下一次循环。在for循环和while循环中有所差异。
4.1 while循环中break和continue
4.1.1 break实例
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 8)
break;
printf("%d ", i);
i++;
}
return 0;
}
执行结果,如下:
4.1.2 continue实例
continue 为”继续“的意思,在循环中的作用为跳过本次循环中continue后面的代码,继续执行下一次循环。
把上例代码中的 break语句 修改为 continue语句 会是什么结果呢?
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 8)
continue;
printf("%d ", i);
i++;
}
return 0;
}
分析:当 i == 8后,就执行 continue ,直接跳过了continue后面的代码,继续判断循环条件。因为这里跳过了 i++;语句,所以i 的值一直为8,程序陷入死循环中。
continue 语句可以帮助我们跳过某一次循环中continue后面的代码,直接跳到循环条件部分,进行下一次循环的判断,如果循环变量的调整在continue语句后面,就有可能出现死循环。
4.2 for循环中 break 和 continue
4.2.1 break实例
for循环中使用break语句和while循环中的使用类似,在for循环中使用break 也是用于终止循环。只要执行到break,直接跳出循环。
#include <stdio.h>
int main()
{
int i = 1;
for(i = 1 ; i <= 10 ; i++)
{
if (i == 8)
break;
printf("%d ", i);
}
return 0;
}
运行结果:
4.2.2 continue实例
上述代码中的break修改为continue会是什么结果呢?
#include <stdio.h>
int main()
{
int i = 1;
for(i = 1 ; i <= 10 ; i++)
{
if (i == 8)
continue;
printf("%d ", i);
}
return 0;
}
运行结果:
显然输出结果并没有 ”8“.所以在for循环中continue语句的作用是跳出本次循环中continue后面的代码,直接执行循环调整部分。在实际生活中,如果发生某个条件就无需执行后续某些操作时,可以使用continue语句实现。
4.3 do while循环中的break和continue
do while语句 中的 break 和 continue的作用和while循环中类似。
4.3.1 break实例
#include <stdio.h>
int main()
{
int i = 1;
do
{
if (i == 8)
break;
printf("%d ", i);
i++;
}while (i <= 10);
return 0;
}
运行结果: 当 i == 8时,终止循环。
4.3.2 continue实例
#include <stdio.h>
int main()
{
int i = 1;
do
{
if (i == 8)
continue;
printf("%d ", i);
i++;
}while (i <= 10);
return 0;
}
运行结果为当i == 8时,由于跳过coninue后面的代码,执行不到循环的调整部分,所以程序陷入死循环中。
5.循环的嵌套
到这里我们已经学习完三种循环结构,分别是for循环,while循环和do while循环,这三种循环一般都可以嵌套在一起使用,来解决更多复杂的问题,这就是接下来要讲的循环嵌套 。
5.1 练习
需求:找出100~999之间的素数,并打印输出
注:素数又称为质数,只能被 1 和 本身整除的数字。
需求分析:首先假设要判断 i 是否为素数,需要拿 2~i-1 之间的数字去试除i,则要先产生 2~i-1 之间的数字,也可以使用循环解决。如果 2~i-1 之间有数字能整除 i ,则 i 不是素数,如果都不能整除 i,则 i 是素数。
#include <stdio.h>
int main()
{
int i = 0;
//循环产生100~999的数字
for (i = 100; i <= 999; i++)
{
int j = 0;
int flag = 1;//假设 i 是素数
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", i);
}
}
return 0;
}
6.goto语句
goto语句和跳转标号是搭配使用的,goto语句可以实现在同一个函数内跳转到设置好的标号处。
例如:
#include <stdio.h>
int main()
{
printf("hello\n");
goto past;
printf("world\n");
past:
printf("跳过world打印\n");
return 0;
}
goto语句在使用时,位置如果没有放置得当,容易导致在函数内部随意跳转,打乱程序的执行流程,所以建议能不使用就不使用;但goto语句也有能够发挥它的作用的场景,如在多层循环的代码中,如果想要快速跳出循环,使用 goto语句就非常容易。
for(……)
{
for(……)
{
for(……)
{
if(disaster)
goto go;
}
}
}
go:
……
原本在for循环中想要提前跳出循环得使用break语句,但一个break语句只能跳出一层for循环,如果有3层循环嵌套就要使用 3 个break语句才能跳出循环,因此在这种场景下使用 goto语句就会更加便捷。