C语言提供了3种循环语句,分别是 while、for、do-while。本篇文章主要介绍这三种语句的基本用法以及break和continue在循环中的应用。
1.while循环
1.1 if和while的对比
if(表达式)
语句;
while (表达式)
语句;
if语句的语法形式和while语句是类似的,但是还有一定的区别。
//if
int main()
{
if (1)
printf("hehe\n");
return 0;
}
//while
int main()
{
while(1)
printf("hehe"\n);
return 0;
}
两段代码的执行结果如下:
可以看出if和while的区别就是:while语句可以实现循环效果
1.2 while语句的执行流程
首先就是判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次循环。
1.3 while循环的实践
练习:在屏幕上打印1-10
int main() {
int i = 1;
while (i <= 10) {
printf("%d ", i);
i++;
}
return 0;
}
1.4 练习
输入一个正的整数,逆序打印这个整数的每一位
例如:
输入:1234 ,输出 4 3 2 1
输入:531 ,输出 5 3 1
题目解析
- 要得到n的最低位,可以使用n%10。
- 要去掉n的最低位,可以使用n/10。
- 循环1和2两个步骤,在n变成0之前,就可以得到所有的位数
int main()
{
int n = 0;
scanf("%d", &n);
while (n )
{
printf("%d ", n%10);
n = n / 10;
}
return 0;
}
2. for循环
2.1 for循环的语法形式
for(表达式1;表达式2;表达式3)
语句;
表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整
2.2 for循环的执行流程
首先初始化循环变量,然后执行循环条件判断,结果为0就循环结束;结果不为0则执行循环语句,循环语句执行后,执行循环遍历的调整语句,然后再去执行循环条件判断。整个循环中,初始化部分只执行一次,循环条件判断、循环体、循环变量的调整可能执行多次。
2.3 for循环的实践
练习:在屏幕上打印1-10
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
}
2.4 for循环和while循环的对比
- for循环和while循环都有初始化、判断、调整三个部分。
- for循环的三个部分非常集中,便于代码的维护
- while循环的三个部分比较分散,所以形式上for循环要更优一点
这里不能直观的理解,请继续看下文。
2.5 练习
练习1:计算1-100之间3的倍数的数字之和
int main()
{
int i = 0;
int sum = 0;
for(i=1;i<=100;i++)
{
if (i % 3 == 0)
{
sum = sum + i;
}
}
printf("%d", sum);
return 0;
}
简单优化一下,省去多余的循环判断
int main() {
int sum = 0;
for(int i=3;i<=100;i+=3)
{
if (i % 3 == 0) {
sum = sum + i;
}
}
printf("%d", sum);
}
3. do-while循环
3.1语法形式
do
语句;
while(表达式);
while和for循环都是先判断后执行,而do-whle语句是先执行后判断,所以do-while语句的循环体至少执行一次。
3.2do-while循环的执行流程
do-while语句先执行循环体,然后执行循环条件判断,如果结果是0,循环结束,否则就继续循环。一般do-whle循环使用在循环体至少被执行一次的场景下,所以较少使用。
3.3do-while循环的实例
练习:在屏幕上打印1-10
int main()
{
int i = 1;
do {
printf("%d ", i);
i++;
} while (i <= 10);
}
3.4 练习
输入一个整数,计算这个整数是几位数
例如:
输入:1234 输出 4
输入:12 输出 2
int main()
{
int n = 0;
scanf("%d", &n);
int cnt = 0;
do {
cnt++;
n /= 10;
} while (n);
printf("%d", cnt);
return 0;
}
不是必须要使用do-while语句,只是在特定的情况下比较适合使用do-while语句,因为n即使是0,也是一位数,要统计位数的。但是如果写成其他的循环,代码会比较复杂。
例如while循环,代码如下:
int main()
{
int n = 0;
scanf("%d", &n);
int cnt = 0;
if (n == 0)
cnt = 1;
else
{
while (n)
{
cnt++;
n /= 10;
}
}
printf("%d", cnt);
return 0;
}
4. break和continue语句
- break的作用是用于永久的终止循环,只要break被执行,直接就会跳出循环,继续往后执行。
- continue的作用是跳过本次循环中contine后边的代码,在for循环和while循环中有所差异。
4.1while循环中的break和continue
4.1.1 break举例
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break; //1 2 3 4
printf("%d ", i);
i++;
}
return 0;
}
打印了1,2,3,4后,当i==5的时候,循环在break的地⽅终⽌,不再打印,不再循环。
4.1.2 continue举例
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i++;
}
return 0;
}
当i==5后,就执⾏continue,直接跳过continue后面循环体的代码,因为这⾥跳过了i = i+1,所以i⼀直为5,程序陷⼊死循环。
4.1.3 continue变式
这里把 i++放在循环体的最前面,代码的执行结果如何呢
int main()
{
int i = 1;
while (i <= 10) {
i++;
if (i == 5)
continue;
printf("%d ", i); // 2 3 4 6 7 8 9 10 11
}
}
代码首次进入循环体的适合,先自增后打印,所以第一个打印的是2,当i==5后,就执⾏continue,跳过了5的打印,执行下一次打印,最后一次循环,i为10,进入循环体自增加1,所以最后打印的是11。
4.2 for循环中的break和continue
4.2.1 break举例
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break; // 1 2 3 4
printf("%d", i);
}
return 0;
}
当i==5时,执行break语句直接跳出循环所以只打印 1 2 3 4,这个和while循环的break举例类似。
4.2.2 continue举例
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
当i==5的时候,执行continue语句,跳过后面的代码,但这里的coninues只是跳过的打印函数,而无法跳过i++。
continues在while和for略有区别。
4.2.3 continue变式
把i++放在循环体的,代码的执行结果时什么?
int main()
{
int i = 0;
for (i = 1; i <= 10;)
{
if (i == 5)
continue;
printf("%d ", i); // 1 2 3 4 //
i++;
}
return 0;
}
代码出现了死循环,执行结果和while的continue一样,原因是i==5的时候执行continue语句,跳过了i++,i一直是5,一直循环。
4.3 do-while循环中的break和continue
4.3.1 break举例
int main()
{
int i = 1;
do
{
if (i == 5)
break;
printf("%d ", i);
i++;
} while (i <=10);
return 0;
}
do-while循环的break举例和while循环、for循环的举例类似。i==5的时候执行break语句跳出了循环,只打印了 1 2 3 4。
4.3.2 continue举例
int main()
{
int i = 1;
do
{
if (i == 5)
continue;
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
do-while的continue举例和while循环的类似,都是因为在执行continue语句的时候,跳过了i++,i的值不变,导致了死循环。
4.3.3 continue变式
如果把i++放在循环体的第一行呢?
int main()
{
int i = 1;
do
{
i++;
if (i == 5)
continue;
printf("%d ", i);
} while (i <= 10);
return 0;
}
这段代码和while循环continue变式的执行过程类似,这里不再赘述。
4.4 break和continue小结
- break用于永久的终止循环,执行循环后面的代码
- continue用于跳过本次循环,执行下一次循环
- 三种循环中for循环使用的最多,do-while循环使用的最少
- 上面分别例举三种循环的三种形式的代码是用来对比学习,具体代码具体分析
5. 循环的嵌套
前面学习了三种循环 while、for、do-while,三种循环往往嵌套在一起才能更好的解决问题,这就是:循环嵌套。
5.1 练习
找出 100-200之间的素数,并打印在屏幕上。
素数:只能被1和自身整数的数
5.2 题目解析
- 要成100-200之间找出素数,首先得有100-200之间的数,这个可以使用一个循环解决
- 假设要判断i是否为素数,需要拿2~i-1之间的数字区试除i,需要产生2到i-1之间的数字,也可以使用循环解决。
- 如果2~i-1之间有数字整除i,则不是素数,如果都不能整除,则i是素数。
int main()
{
int i = 0;
for (i = 100; i <= 200; i++) {
int flag = 1;
int j = 0;
for (j = 2; j <=j-1 ; j++) {
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
printf("%d ", i);
}
return 0;
}
执行到if语句之前有两种可能的路径,一种就是break跳出循环了,这个时候i不是素数不执行if语句,另一种是内存循环执行完毕,这说明i是素数,执行if语句。
欢迎大家交流讨论和批评指正。