系列文章目录
文章目录
3.3.3 do while循环中的break和continue
1. 控制语句
-
分支语句(Conditional Statements) -
if
,else if
,else
,switch
语句:if
语句:根据条件为真时,执行特定代码块。else if
语句:如果前面的if
或else if
的条件为假,将执行另一个条件的测试。else
语句:如果所有的if
和else if
条件都不满足,将执行else
块中的代码。switch
语句:根据变量的值来决定执行多个代码块中的哪一个。
-
循环语句(Loop Statements) -
while
,do-while
,for
语句:while
语句:在给定条件为真的情况下反复执行一个代码块。do-while
语句:至少执行一次代码块,之后如果条件为真,则继续执行。for
语句:允许在循环开始之前初始化变量,定义循环运行的条件,以及在每次循环迭代后更新变量。
-
跳转语句(Jump Statements) -
break
,continue
,return
,goto
语句:break
语句:立即退出最近的循环或switch
语句。continue
语句:跳过当前循环的剩余部分,直接进入下一次迭代。return
语句:退出当前函数,并返回一个值(如果提供)。goto
语句:直接跳转到同一函数中的另一个位置,这个位置由一个标签标明。
2. 分支语句
2.1 if语句
在 C 语言中,if
语句是一种基本的条件控制语句,用来根据条件执行不同的代码分支。它允许程序基于一个或多个条件的真假来选择性地执行代码块。
语法结构:
if (condition1) {
// 代码块1: 当条件1为真时执行
} else if (condition2) {
// 代码块2: 当条件2为真时执行
} else if (condition3) {
// 代码块3: 当条件3为真时执行
} else {
// 代码块4: 当所有条件都不为真时执行
}
只有第一个为真的条件对应的代码块会被执行。如果所有的 if
和 else if
条件都为假,那么 else
块(如果存在)将被执行。
代码示例:
#include <stdio.h>
int main()
{
int mark = 0; // 整型变量mark来存储成绩,并初始化为0
scanf("%d", &mark); // 读取用户输入的成绩并存储到变量mark中
// 使用if-else if-else语句根据mark的值打印不同的输出
if(mark<60) // 如果成绩小于60
{
printf("不及格\n"); // 打印"不及格"
}
else if(mark>=60 && mark<80) // 如果成绩在60到79之间
{
printf("及格\n"); // 打印"及格"
}
else if(mark>=80 && mark<100) // 如果成绩在80到99之间
{
printf("优秀\n");
}
else if(mark=100) // 注意这里有一个逻辑错误。这里使用了赋值操作符'='而不是比较操作符'=='
{
printf("满分\n");
}
else // 如果上述所有条件都不满足
{
printf("缺考\n");
}
return 0;
}
输出1-100之间的奇数
#include <stdio.h>
int main() {
printf("1-100之间的奇数有:\n");
// for循环从1开始到100结束,i每次循环增加1
for (int i = 1; i <= 100; i++) {
// if语句判断i是否为奇数,如果i除以2的余数不为0,则是奇数
if (i % 2 != 0) {
// 打印奇数i,并在数字后加空格
printf("%d ", i);
}
}
// for循环结束后打印一个换行符,为了输出格式整齐
printf("\n");
return 0;
}
2.2 switch语句
switch
语句是C语言中的一个控制语句,用于基于不同的条件执行不同的代码块。其通常与一系列的 case
语句一起使用,并可选地包括一个 default
语句。
switch (expression) {
case constant1:
// 代码块1
break;
case constant2:
// 代码块2
break;
...
default:
// 默认的代码块
break;
}
-
expression
:这是一个返回整型的表达式,switch
语句将根据这个表达式的结果决定执行哪一个case
。 -
case
:这个关键字后面跟着一个与expression
表达式可能等于的常量值。如果expression
的结果与某个case
后面的值匹配,控制流就会跳转到这个case
语句块。 -
break
:这个关键字用于结束当前的case
语句块,确保如果匹配了一个case
,程序就不会继续执行下一个case
语句块。如果省略break
,程序将会继续执行下一个case
的代码,不管它的条件是否满足,这称为“case 穿透”。 -
default
:这是一个可选的语句块,它在expression
的值与所有case
都不匹配时执行。default
语句通常放在switch
结构的最后,不需要break
,因为它已经是最后一个语句块了。
switch
语句是比多个 if-else if
语句更简洁的方式来实现多路分支,尤其当有许多固定值的条件需要检查时。然而,switch
只能用于等值比较,而不能用于范围检查或复杂的条件表达式。
代码示例:
#include <stdio.h>
int main() {
int day = 0;
printf("请输入星期的数字 (1到7):");
scanf("%d", &day); // 从用户处获取星期的数值
switch(day) {
case 1: // 如果输入的是1
printf("星期一\n");
break;
case 2: // 如果输入的是2
printf("星期二\n");
break;
case 3: // 如果输入的是3
printf("星期三\n");
break;
case 4: // 如果输入的是4
printf("星期四\n");
break;
case 5: // 如果输入的是5
printf("星期五\n");
break;
case 6: // 如果输入的是6
printf("星期六\n");
break;
case 7: // 如果输入的是7
printf("星期天\n");
break;
default: // 如果输入的数字不在1到7的范围内
printf("输入错误!请输入一个从1到7的数字。\n");
break;
}
return 0;
}
#include <stdio.h>
int main() {
int day = 0; // 初始化day变量为0
switch(day) { // 根据day的值进行判断
case 1: // 如果day是1到5之间的任意值
case 2:
case 3:
case 4:
case 5:
printf("weekday\n"); // 打印"weekday"
break; // 结束switch语句
case 6: // 如果day等于6或7
case 7:
printf("weekend\n"); // 打印"weekend"
break; // 结束switch语句
}
return 0;
}
3. 循环语句
3.1 while循环
3.1.1 基本语法
while
循环是C语言中的基本循环构造,它用于重复执行一组语句,直到指定的条件为假(即测试为非零值)。while
循环的基本语法如下:
while (condition) {
// 循环体
}
condition
是循环每次迭代前都会检查的表达式。如果条件表达式的结果为真(即值非0),则循环体内的语句会执行。- 如果循环体中的语句执行完毕后,程序将再次检查条件。如果条件仍然为真,循环将继续执行。
- 这个过程会一直重复,直到条件表达式的结果为假(即值为0),此时
while
循环结束,程序执行循环之后的下一条语句。
3.1.2 代码示例:
#include <stdio.h>
int main() {
int i = 1; // 初始化计数器为1
while (i <= 10) { // 条件是计数器小于或等于10
printf("%d ", i); // 打印当前计数器的值
i++; // 将计数器增加1
}
printf("\n"); // 在循环结束后换行
return 0;
}
while
循环特别适用于当事先不知道需要执行循环体多少次时。只要循环条件为真,循环就会继续。这是与 for
循环的主要区别,后者在循环开始之前就设定了迭代的次数。需要注意的是,如果 while
循环的条件从未变为假,则会形成无限循环,这通常是需要避免的,除非有特定的退出循环的机制。
3.1.3 while语句中的break和continue
在C语言中,break
和 continue
是控制循环行为的两个重要关键字,尤其在 while
循环中非常有用。它们用于改变循环的正常流程。
break
break
语句用于立即退出包围它的最近的循环(while
、for
或 do-while
循环),不管循环条件是什么。在循环内部使用 break
可以基于某个特定条件提前结束循环,不必等到循环条件变为假时才停止循环。它经常用于退出无限循环或者在满足特定条件时提前结束循环。
代码示例:使用 break
退出循环
#include <stdio.h>
int main() {
int i = 1;
while (i <= 10) {
if (i == 5) {
break; // 当i等于5时退出循环
}
printf("%d ", i);
i++;
}
printf("\n i = %d\n", i);
return 0;
}
输出结果为:1 2 3 4
i = 5
continue
continue
语句用于跳过循环的当前迭代,并立即进行下一次迭代的循环条件测试。在 while
循环中,当执行到 continue
语句时,循环将停止执行当前迭代剩余的代码,并回到循环的顶部(即条件表达式),评估是否应继续执行下一次迭代。也就是说continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的判断。
示例:使用 continue
跳过迭代
#include <stdio.h>
int main() {
int i = 1;
while (i <= 10) {
if (i == 5) {
i++; // 需要增加i,否则会形成无限循环
continue; // 跳过当前迭代的剩余部分,不会输出5
}
printf("%d ", i);
i++;
}
printf("\n");
return 0;
}
在这个例子中,当 i
等于5时,continue
语句执行,这意味着数字5不会被打印,循环直接跳到下一迭代的条件检查。输出的结果为:1 2 3 4 6 7 8 9 10
3.2 for循环
for
循环是C语言中用于重复执行一段代码固定次数的控制结构。它非常适合在已知循环次数的情况下使用。for
循环提供了一个非常简洁的方式来初始化循环控制变量,执行条件测试,以及改变循环控制变量的值。
3.2.1 基本语法
for
循环的基本语法如下:
for (initialization; condition; increment) {
// 循环体
}
- 初始化(Initialization):在循环开始之前,初始化语句只执行一次。通常用来设置循环控制变量的初始值。
- 条件(Condition):在每次循环开始前,都会评估这个表达式。如果条件为真(非零),则执行循环体。如果条件为假(零),则退出循环。
- 增量(Increment):每次循环体执行后,都会执行这个步进语句。通常用来更新循环控制变量。
3.2.2 代码示例
循环打印从1到5的数字:
#include <stdio.h>
int main() { //循环控制变量 i 被初始化为1。只要i小于或等于5循环会继续,每次循环后 i 的值增加1
for (int i = 1; i <= 5; i++) {
printf("%d ", i);
}
printf("\n");
return 0;
}
使用场景
- 遍历数组:
for
循环经常用来遍历数组中的元素。 - 重复执行已知次数的操作:当知道需要执行某操作的确切次数时,
for
循环是理想的选择。 - 嵌套循环:在需要使用多层循环时,
for
循环可以嵌套使用,如在处理多维数组时。
3.2.3 for循环中的break和continue
在C语言的 for
循环中,break
和 continue
允许在循环中改变执行流程。这两个语句在 for
循环中的行为与在 while
循环中的行为是一致的。
break 语句
在 for
循环中,break
语句用于立即终止整个循环。当执行到 break
语句时,循环停止,控制流跳出循环体,继续执行循环之后的下一条语句。break
语句常用于以下情况:
- 当满足某个特定条件时,没有必要继续执行循环。
- 当发现错误或异常情况,需要提前退出循环。
示例:在 for
循环中使用 break
#include <stdio.h>
int main() {
for (int i = 1; i <= 10; i++) {
if (i == 6) {
break; // 当i等于6时,退出循环
}
printf("%d ", i);
}
printf("\nLoop ended early.\n");
return 0;
}
在这个例子中,循环将只打印从1到5的数字。当 i
等于6时,break
语句执行,循环提前结束。
continue 语句
在 for
循环中,continue
语句用于跳过当前循环的剩余部分,并直接进入下一次迭代的条件测试。这意味着循环中位于 continue
语句之后的代码将被忽略,循环会直接进行增量步骤和条件检查。continue
语句通常用于以下情况:
- 忽略某些特定条件下的循环迭代。
- 减少循环体内部的嵌套层次。
示例:在 for
循环中使用 continue
#include <stdio.h>
int main() {
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 如果i是偶数,跳过当前循环的剩余部分
}
printf("%d ", i);
}
printf("\nOnly odd numbers printed.\n");
return 0;
}
在这个例子中,循环将打印1到10之间的所有奇数。对于偶数,continue
语句执行,因此 printf
调用被跳过,循环继续到下一次迭代。
3.2.4 嵌套for循环的示例
每次外层循环开始时,内层循环的计数器 j
都被重新初始化为0。因此,无论外层循环 i
进行多少次迭代,内层循环都将完整地执行10次迭代,因为每次都是从 j=0
开始,直到 j<10
的条件不满足为止。这就确保了 test被打印100次。
int i = 0;
int j = 0;
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
printf("test\n");
}
}
在下面的代码中,j
在外部初始化为0,但在内层循环之前并没有重新初始化。这意味着:
- 在第一次外层循环 (
i=0
) 时,j
从0开始,内层循环正常执行,直到j
达到10(j
递增到10后,j<10
的条件不再成立,内层循环结束)。 - 当第二次外层循环开始时(
i=1
),j
的值仍然是10(没有重新设为0),所以内层循环的条件j<10
已经不成立,内层循环根本不执行。 - 对于所有后续的外层循环迭代 (
i=2
到i=9
),情况相同,内层循环不会执行,因为j
的值仍然是10。
因此,test 只在第一次外层循环的10次内层迭代中被打印,共计10次。
int i = 0;
int j = 0;
for(; i<10; i++)
{
for(; j<10; j++)
{
printf("test\n");
}
}
3.3 do while循环
在C语言中,do...while
循环是一种后测试循环控制结构,这意味着循环体至少执行一次,之后再检查循环的继续条件。这与 while
循环不同,后者是先测试条件,只有当条件为真时才执行循环体。do...while
循环特别适用于那些至少需要执行一次循环体,之后根据某种条件决定是否继续执行的情况。
3.3.1 基本语法
do {
// 循环体
} while (condition);
- 循环体:放置在
do
和while
之间的是循环体,它包含了需要重复执行的代码块。 - 条件:放在
while
后面的是一个逻辑表达式,循环会继续执行,只要这个条件为真(非零)。在循环体执行完后,条件被检查一次,如果为真,则循环再次执行;如果为假,则循环结束,控制流程跳转到do...while
循环之后的下一条语句。
3.3.2 代码示例
#include <stdio.h>
int main() {
char test;
do {
printf("这是一个 do...while 循环。\n");
printf("要继续吗? (y/n): ");
scanf(" %c", &test); // 注意空格前缀来跳过缓冲区中的任何前一个残留新行符
} while (test== 'y' || test== 'Y');
return 0;
}
在这个例子中,循环体首先打印一条消息,并询问用户是否继续。无论用户第一次如何回答,消息至少打印一次。循环继续的条件是用户输入 'y'
或 'Y'
。如果用户输入 'n'
或 'N'
,循环将在第一次执行后结束。
- 至少执行一次:
do...while
循环保证至少执行一次循环体,这在某些情况下非常有用,例如,当需要至少从用户获取一次输入时。
3.3.3 do while循环中的break和continue
在 do...while
循环中,break
和 continue
语句用于控制循环的执行流程,就像它们在其他循环结构(如 for
和 while
循环)中的作用一样。
break 语句
在 do...while
循环中,break
语句用于立即终止循环,即使循环条件仍然为真。当执行到 break
语句时,循环停止,控制流跳转到 do...while
循环后的下一条语句。
示例:使用 break
在 do...while
循环中
#include <stdio.h>
int main() {
int count = 1;
do {
printf("当前计数:%d\n", count);
if (count == 5) {
break; // 当计数达到5时退出循环
}
count++;
} while (count <= 10);
printf("循环结束 \n");
return 0;
}
在这个例子中,尽管循环条件允许计数到10,但当计数达到5时,break
语句会导致循环提前终止。
continue 语句
在 do...while
循环中,continue
语句用于跳过当前循环的剩余部分,并直接回到循环条件的测试(循环的末尾)。如果条件为真,循环继续执行;如果为假,循环结束。continue
语句适用于跳过某些特定条件下的迭代,而不是完全退出循环。
示例:使用 continue
在 do...while
循环中
#include <stdio.h>
int main() {
int count = 0;
do {
count++;
if (count % 2 == 0) {
continue; // 如果计数是偶数,跳过当前迭代的剩余部分
}
printf("奇数:%d\n", count);
} while (count < 10);
printf("循环结束 \n");
return 0;
}
在这个例子中,当 count
是偶数时,continue
语句执行,跳过打印语句,直接进行下一次循环条件测试。因此,只有奇数被打印。
3.4 循环语句代码示例
void menu() // menu 函数打印一个简单的菜单,给用户两个选项:1(玩游戏)和0(退出)。
printf("**********************************\n");
printf("*********** 1.play **********\n");
printf("*********** 0.exit **********\n");
printf("**********************************\n");
}
void game() // 首先生成一个1到100之间的随机数,然后进入一个无限循环,提示用户猜一个数字。
// 根据用户的输入,程序会给出不同的的反馈。如果用户猜对了数字,循环会通过 break 语句结束。
{
int random_num = rand() % 100 + 1; // 生成一个1到100之间的随机数
int input = 0; // 用于存储用户的猜测
while(1) // 无限循环,直到用户猜中数字
{
printf("请输入猜的数字>:");
scanf("%d", &input); // 获取用户输入
if(input > random_num)
{
printf("猜大了\n");
}
else if(input < random_num)
{
printf("猜小了\n");
}
else
{
printf("猜对了\n");
break; // 猜对跳出循环
}
}
}
int main() //开始于设置随机数生成的种子,以确保每次运行程序时生成的随机数序列都不同。
// 首先进入一个 do-while 循环,在这个循环中,显示菜单并根据用户的选择执行相应的操作。
// 如果用户选择1,调用 game 函数开始游戏;如果选择0,循环结束,程序退出;
// 如果输入其他任何值,则提示错误并要求重新输入。循环持续进行,直到用户选择退出(即输入0)。
{
int input = 0; // 存储用户的选择
srand((unsigned)time(NULL)); // 设置随机数种子
do
{
menu(); // 显示菜单
printf("请选择>:");
scanf("%d", &input); // 获取用户选择
switch(input)
{
case 1:
game(); // 选择1时,执行游戏
break;
case 0:
break; // 选择0时,退出循环,结束程序
default:
printf("选择错误,请重新输入!\n"); // 输入无效数据时的错误消息
break;
}
} while(input); // 只要input不为0,继续循环
return 0;
}
4. goto语句
goto
语句是 C 语言中的一种控制流语句,它允许程序跳转到当前函数内标记的其他位置。使用 goto
语句可以无条件地转移到程序的另一部分。但是多层循环这种情况使用break是达不到目的的,它只能从最内层循环退出到上一层的循环。 尽管 goto
语句提供了极大的灵活性,它也是一个颇具争议的特性,因为如果使用不当,可能会导致代码难以阅读、维护和理解。
4.1 基本语法
goto label;
...
label: statement;
goto label;
是goto
语句,其中label
是用户定义的标记,用于标识程序中的位置。label:
是标签声明,后面跟着的是跳转后将执行的语句。
4.2 代码示例
#include <stdio.h>
int main() {
int i = 0;
while (i < 10) {
if (i == 5) {
goto exit_test; // 当 i 等于 5 时跳转到exit_test
}
printf("%d ", i);
i++;
}
exit_test: // 标签
printf("\n跳出循环在 i = %d\n", i);
return 0;
}
在这个例子中,程序将打印从 0 到 4 的数字。当 i
等于 5 时,goto
语句触发,程序跳转到 exit_test
标签处,跳过循环的其余部分。
4.3 goto语句和循环语句对比
使用goto语句:
#include <stdio.h>
int main() {
char input[10] = {0};
system("shutdown -s -t 60"); // 计划在60秒后关机
again: // 标签定义
printf("电脑将在1分钟内关机,如果输入:取消,就取消关机!\n请输入:>");
scanf("%s", input); // 从用户接收输入
if(0 == strcmp(input, "取消")) { // 比较用户输入
system("shutdown -a"); // 如果输入匹配,则取消关机
} else {
goto again; // 如果不匹配,跳转到标签 `again`,重新提示用户输入
}
return 0;
}
不使用goto语句:
#include <stdio.h>
#include <stdlib.h> // 包含stdlib.h以调用system函数
int main() {
char input[10] = {0};
system("shutdown -s -t 60"); // 计划在60秒后关机
while(1) { // 使用无限循环
printf("电脑将在1分钟内关机,如果输入:取消,就取消关机!\n请输入:>");
scanf("%s", input); // 从用户接收输入
if(0 == strcmp(input, "取消")) { // 比较用户输入
system("shutdown -a"); // 如果输入匹配,则取消关机
break; // 结束循环
}
// 如果不匹配,循环继续,再次提示用户输入
}
return 0;
}
这两个程序虽然使用不同的方法,但都实现了相同的功能。第一个程序通过 goto
实现循环,而第二个程序使用循环语句。通常来说,使用 while
循环会使代码更易于理解和维护,避免使用 goto
可以减少代码的复杂度并提高代码质量。