1. while循环
C语⾔提供了3种循环语句,while
就是其中⼀种,接下来就介绍⼀下while
语句。
while语句的语法结构和
if`语句⾮常相似
1.1 if 和 while的对⽐
C语言中的if
和while
都是控制语句,用于控制程序的执行流程。
if
语句是一种单向分支结构,它的作用是根据条件的真假来执行特定的代码。if
语句的基本语法如下:
if (condition) {
// if语句为真时执行的代码
}
在if语句中,condition
是一个逻辑表达式,它的值为true
或false
。当condition
为true
时,if语句中的代码块将会被执行;当condition
为false
时,if语句中的代码块将会被跳过。
while
语句是一种循环结构,它会重复执行一段特定的代码,直到某个条件不再为true为止。while
语句的基本语法如下:
while (condition) {
// while语句为真时执行的代码
}
在while
语句中,condition是一个逻辑表达式,它的值为true或false。当condition为true时,while语句中的代码块将会被重复执行;当condition为false时,while语句将会结束循环,并继续执行后续代码。
if和while的对比:
- 功能不同:if语句是一种单向分支结构,用于根据条件的真假执行特定的代码;while语句是一种循环结构,会根据条件是否为真重复执行一段特定的代码。
- 语法不同:if语句只有一个代码块;while语句有一个开头和一个结尾,并且可以包含多个代码块。
- 使用场景不同:if语句通常用于判断条件是否为真,并执行相应的操作;while语句通常用于重复执行相同的操作,直到满足某个条件为止。
在实际编程中,if和while经常会一起使用,来实现更为复杂的逻辑。例如,在while循环中嵌套if语句,可以根据不同的条件执行不同的操作。
1.2 while语句的执⾏流程
2.for循环
2.1 语法形式
for循环是一种非常常用的循环结构。for循环的语法形式如下:
for (初始化表达式; 循环条件; 迭代表达式) {
循环体语句;
}
其中,初始化表达式是在循环开始前执行的语句;循环条件是一个逻辑表达式,如果值为true则继续执行循环体,否则跳出循环;迭代表达式是在每次循环结束后执行的语句。
for循环的执行顺序如下:
- 执行初始化表达式;
- 判断循环条件,如果条件为false则跳出循环;
- 执行循环体语句;
- 执行迭代表达式;
- 重复步骤2~4,直到循环条件为false。
for循环可以用于遍历数组、进行计数器循环等多种场景。在初始化表达式、循环条件和迭代表达式中,可以使用多个语句,这些语句以逗号分隔。也可以在循环体中使用break语句和continue语句来控制循环的执行。
2.2 for循环的执行流程
⾸先执⾏表达式1
初始化循环变量,接下来就是执⾏表达式2
的判断部分,表达式2
的结果如果
==0,则循环结束;表达式2
的结果如果!=0则执⾏循环语句,循环语句执⾏完后,再去执⾏表达式 3
,调整循环变量,然后再去表达式2
的地⽅执⾏判断,表达式2
的结果是否为0,决定循环是否继
续。
整个循环的过程中,表达式1
初始化部分只被执⾏1次,剩下的就是表达式2、循环语句、表达式3在循
环。
3.do-while循环
3.1 语法形式
do-while循环语句是一种控制流程语句,也称为“后测试循环”或“至少执行一次循环”语句。它的语法形式如下:
do {
循环体语句;
} while(循环条件);
其中,do后面是循环体语句,花括号中是需要执行的代码。while后面是一个循环条件,一旦条件为真,就会继续执行循环体语句。如果条件为假,则跳出循环。
与while循环不同的是,do-while循环保证循环体至少会执行一次,无论循环条件是否成立。这是因为它的判断语句是在循环体末尾执行的。
do-while循环通常用于用户输入的校验,或者需要至少执行一次循环体的情况。需要注意的是,由于do-while循环保证循环体至少执行一次,因此在循环体中的第一次执行可能不受循环条件的限制,需要特别注意循环体的安全性。
下面是一个简单的do-while循环的例子,用于计算输入的数字之和,直到输入0为止:
#include <stdio.h>
int main()
{
int num, sum = 0;
do {
printf("请输入一个整数(输入0结束):");
scanf("%d", &num);
sum += num;
} while (num != 0);
printf("输入的数字之和为:%d\n", sum);
return 0;
}
3.2 do while循环的执行流程
do-while循环是一种后测试循环,它允许至少一次执行循环体,之后在条件检查前反复执行循环体,直到条件成立或被中断。其基本语法结构为:
do {
循环体语句;
} while (循环条件);
执行流程如下:
-
程序运行到do关键字时,先执行循环体内的语句。
-
执行完循环体内的语句后,程序会执行while后的条件检查。
-
如果条件为真,则回到第1步,继续执行循环体内的语句;否则,退出循环,继续执行do-while语句后面的代码。
需要注意的是,在执行do-while循环时,循环条件是在循环运行完之后再进行检查的,所以无论循环条件是否成立,循环体内的语句至少会执行一次。这就是do-while循环和while循环的主要区别
4.break和continue语句
break和continue语句是跳转语句,用于在循环语句中控制程序的执行流程。
break语句:当执行到break语句时,程序立即跳出当前循环语句,继续执行紧接着循环语句的下一行代码。break通常用于满足某些条件后终止循环,例如:
for(int i = 0; i < 10; i++) {
if(i == 5) {
break;
}
printf("%d ", i);
}
上面的代码中,当i等于5时,程序将跳出循环,不再执行后续的循环语句,输出结果为:0 1 2 3 4。
continue语句:当执行到continue语句时,程序会跳过当前循环中剩余的代码,继续执行下一次循环。continue通常用于满足某些条件后跳过本次循环,例如:
for(int i = 0; i < 10; i++) {
if(i % 2 == 0) {
continue;
}
printf("%d ", i);
}
上面的代码中,当i为偶数时,程序将跳过本次循环,不再执行后续的循环语句,输出结果为:1 3 5 7 9。
4.1 while循环中的break和continue
4.1.1 break举例
在C语言中,while循环可以使用break语句来中断循环。当某个条件满足时,break语句将立即终止while循环,并跳转到循环后面的代码。
下面是一个使用while循环和break语句的示例:
#include <stdio.h>
int main() {
int i = 0;
while (1) {
i++;
if (i == 5) {
break;
}
printf("%d\n", i);
}
printf("End of loop\n");
return 0;
}
在这个例子中,while循环将一直执行,直到i的值等于5。当i等于5时,break语句被执行,并立即退出循环。输出结果如下:
1
2
3
4
End of loop
注意,在使用while循环和break语句时要小心,以避免无限循环或过早退出循环。如果循环条件不正确或者break语句的位置不正确,循环可能会变得无限循环或终止得太早。因此,在编写代码时应仔细考虑使用break语句的位置和条件。
4.1.2 continue举例
continue
语句用于跳过当前循环中的某次迭代,继续下一次循环迭代。
在while
循环中,当continue
语句被执行时,程序会跳过本轮循环内continue
语句后面的语句,直接进入下一轮循环的条件判断。
以下是一个简单的例子,展示了在while
循环中使用continue
的情况:
#include <stdio.h>
int main() {
int i = 0;
while (i < 10) {
i++;
if (i == 5)
continue; // 跳过本轮循环,继续下一次循环
printf("%d\n", i);
}
return 0;
}
上述程序输出结果为:
1
2
3
4
6
7
8
9
10
因为当i
等于5时,continue
语句被执行,跳过了打印5
这一步,继续下一轮循环输出剩余的数字。
4.2 for循环中的break和continue
4.2.1 break举例
for循环中的break语句可以用于立即退出循环。当循环中的某个条件满足时,可以使用break语句来退出循环。此时程序将跳出整个循环体,继续执行循环体后的语句。
下面是一个示例,当循环变量i等于5时,break语句将使得整个循环立即退出。
#include<stdio.h>
int main()
{
int i;
for(i=1;i<=10;i++)
{
if(i==5)
break;
printf("%d ", i);
}
return 0;
}
运行结果:
1 2 3 4
4.2.2 continue举例
for循环中的continue是一个关键字,用于控制循环的过程。当程序执行到continue时,会直接跳过当前循环中剩余的代码,开始下一轮的循环。具体来说,当循环条件中的判断语句为真时,执行循环体内的代码,如果遇到了continue,就会跳过当前循环剩余的代码,开始下一轮循环的判断。
例如,下面的代码展示了一个使用continue的示例:
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; // 如果i是偶数,跳过剩余代码,开始下一轮循环
}
printf("%d ", i); // 输出奇数
}
以上代码中,for循环的循环条件是i < 10,当i是偶数时,遇到了continue,就跳过了下面的printf语句,直接开始下一轮循环,输出的结果只包括奇数。在C语言中,for循环中的continue是一个关键字,用于控制循环的过程。当程序执行到continue时,会直接跳过当前循环中剩余的代码,开始下一轮的循环。具体来说,当循环条件中的判断语句为真时,执行循环体内的代码,如果遇到了continue,就会跳过当前循环剩余的代码,开始下一轮循环的判断。
例如,下面的代码展示了一个使用continue的示例:
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; // 如果i是偶数,跳过剩余代码,开始下一轮循环
}
printf("%d ", i); // 输出奇数
}
以上代码中,for循环的循环条件是i < 10,当i是偶数时,遇到了continue,就跳过了下面的printf语句,直接开始下一轮循环,输出的结果只包括奇数。
4.3 do while循环中的break和continue
4.3.1 break举例
do-while循环中的break是一个关键字,用于控制循环的过程。当程序执行到break时,会直接跳出整个循环,开始执行循环之后的代码。
具体来说,当循环体内部的某个条件满足时,程序执行到break语句时,循环就会立即终止。
以下是一个使用do-while循环和break语句的示例程序:
#include <stdio.h>
int main() {
int i = 0;
do {
if (i == 5) {
break;
}
printf("%d ", i);
i++;
} while (i < 10);
printf("\n");
return 0;
}
以上程序中,我们使用do-while循环输出0到9之间的数字,当程序执行到i等于5时,使用break语句直接跳出整个循环,开始执行循环之后的代码,因此只输出了0到4之间的数字。在C语言中,do-while循环中的break是一个关键字,用于控制循环的过程。当程序执行到break时,会直接跳出整个循环,开始执行循环之后的代码。
具体来说,当循环体内部的某个条件满足时,程序执行到break语句时,循环就会立即终止。
以下是一个使用do-while循环和break语句的示例程序:
#include <stdio.h>
int main() {
int i = 0;
do {
if (i == 5) {
break;
}
printf("%d ", i);
i++;
} while (i < 10);
printf("\n");
return 0;
}
以上程序中,我们使用do-while循环输出0到9之间的数字,当程序执行到i等于5时,使用break语句直接跳出整个循环,开始执行循环之后的代码,因此只输出了0到4之间的数字。
4.3.2 continue举例
do while循环中的continue语句用于跳过当前循环中的剩余语句并进入下一次循环的执行。在do while循环中使用continue和在其他类型循环中使用一样。当continue语句执行时,程序将跳过当前循环中出现的其余语句,而直接进行下一次循环的执行。
例如,下面的代码展示了如何使用do while循环中的continue语句来计算一个数组中所有偶数的和:
int array[10] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
int sum = 0;
int i = 0;
do {
if (array[i] % 2 != 0) {
continue; // 如果是奇数就跳到下一次循环
}
sum += array[i];
i++;
} while (i < 10);
printf("偶数和为:%d", sum);
在上面的代码中,如果当前处理的数字是奇数,那么continue语句将跳过计算sum的语句并进行下一次循环。如果当前处理的数字是偶数,那么sum会加上当前处理的偶数的值。最终,程序将输出所有偶数的和。do while循环中的continue语句用于跳过当前循环中的剩余语句并进入下一次循环的执行。在do while循环中使用continue和在其他类型循环中使用一样。当continue语句执行时,程序将跳过当前循环中出现的其余语句,而直接进行下一次循环的执行。
例如,下面的代码展示了如何使用do while循环中的continue语句来计算一个数组中所有偶数的和:
int array[10] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
int sum = 0;
int i = 0;
do {
if (array[i] % 2 != 0) {
continue; // 如果是奇数就跳到下一次循环
}
sum += array[i];
i++;
} while (i < 10);
printf("偶数和为:%d", sum);
在上面的代码中,如果当前处理的数字是奇数,那么continue语句将跳过计算sum的语句并进行下一次循环。如果当前处理的数字是偶数,那么sum会加上当前处理的偶数的值。最终,程序将输出所有偶数的和。
5. 循环的嵌套
循环的嵌套是指在一个循环中嵌套另一个循环。循环嵌套是一种常见的编程技巧,常用于多重循环中,例如处理二维数组、矩阵等数据结构。C语言中支持多重循环嵌套,可以使用for、while、do while等不同类型的循环来实现。
循环嵌套的结构通常是外层循环控制行数,内层循环控制列数,例如:
for (int i = 0; i < 3; i++) { // 外层循环控制行数
for (int j = 0; j < 4; j++) { // 内层循环控制列数
printf("*");
}
printf("\n");
}
上面的代码将在控制台输出一个3行4列的矩形,其中外层循环控制行数,内层循环控制列数。
在多重循环中,需要特别注意循环变量的范围和循环条件的判断,否则程序可能会出现死循环或者逻辑错误。同时,一般情况下不建议嵌套过多的循环,过多的循环嵌套会导致程序执行效率低下,影响程序的性能。
在实际开发中,需要灵活运用循环嵌套技巧,根据具体问题选择合适的循环结构和变量控制,从而提高代码执行效率并实现更加优雅的编程。在C语言中,循环的嵌套是指在一个循环中嵌套另一个循环。循环嵌套是一种常见的编程技巧,常用于多重循环中,例如处理二维数组、矩阵等数据结构。C语言中支持多重循环嵌套,可以使用for、while、do while等不同类型的循环来实现。
循环嵌套的结构通常是外层循环控制行数,内层循环控制列数,例如:
for (int i = 0; i < 3; i++) { // 外层循环控制行数
for (int j = 0; j < 4; j++) { // 内层循环控制列数
printf("*");
}
printf("\n");
}
上面的代码将在控制台输出一个3行4列的矩形,其中外层循环控制行数,内层循环控制列数。
在多重循环中,需要特别注意循环变量的范围和循环条件的判断,否则程序可能会出现死循环或者逻辑错误。同时,一般情况下不建议嵌套过多的循环,过多的循环嵌套会导致程序执行效率低下,影响程序的性能。
在实际开发中,需要灵活运用循环嵌套技巧,根据具体问题选择合适的循环结构和变量控制,从而提高代码执行效率并实现更加优雅的编程。
6.goto语句
goto语句是一种无条件跳转语句,可以将程序控制转移到指定标记(即标签)的代码行处。其语法如下:
goto label;
...
label: statement;
其中,label是标记的名称,statement是需要执行的语句。
使用goto语句可以在代码任意位置跳转到指定位置,例如:
for (int i = 0; i < 10; i++) {
if (i == 5) goto end;
printf("%d\n", i);
}
end:
printf("Loop finished.\n");
在上面的示例中,当i等于5的时候,程序会跳转到标记end处,并输出"Loop finished.",从而提前结束循环。
然而,由于goto语句过于灵活,其使用容易引起程序可读性和可维护性的问题,因此一般情况下建议尽量避免使用goto语句,而采用其他结构化的控制语句(如break、continue、return等)来实现相应的功能。在C语言中,goto语句是一种无条件跳转语句,可以将程序控制转移到指定标记(即标签)的代码行处。其语法如下:
goto label;
...
label: statement;
其中,label是标记的名称,statement是需要执行的语句。
使用goto语句可以在代码任意位置跳转到指定位置,例如:
for (int i = 0; i < 10; i++) {
if (i == 5) goto end;
printf("%d\n", i);
}
end:
printf("Loop finished.\n");
在上面的示例中,当i等于5的时候,程序会跳转到标记end处,并输出"Loop finished.",从而提前结束循环。
然而,由于goto语句过于灵活,其使用容易引起程序可读性和可维护性的问题,因此一般情况下建议尽量避免使用goto语句,而采用其他结构化的控制语句(如break、continue、return等)来实现相应的功能。