C语言控制语句

系列文章目录


第一章 C语言基础知识

第二章 C语言控制语句

第三章 C语言函数详解

第四章 C语言数组详解

第五章 C语言操作符详解

第六章 C语言指针详解


文章目录

系列文章目录

文章目录

1. 控制语句

2. 分支语句

2.1 if语句

2.2 switch语句

3. 循环语句

3.1 while循环

3.1.1 基本语法

3.1.2 代码示例:

3.1.3 while语句中的break和continue

3.2 for循环

3.2.1 基本语法

3.2.2 代码示例

3.2.3 for循环中的break和continue

3.2.4 嵌套for循环的示例

3.3 do while循环

3.3.1 基本语法

3.3.2 代码示例

3.3.3 do while循环中的break和continue

3.4 循环语句代码示例

4. goto语句

4.1 基本语法

4.2 代码示例

4.3 goto语句和循环语句对比


1. 控制语句

控制语句是编程语言中用来改变代码执行顺序的语句,它们使得程序不再是简单地从上到下执行,而是根据特定条件或者某种方式来决定接下来执行哪一部分代码。C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。
  1. 分支语句(Conditional Statements) - if, else if, else, switch 语句:

    • if 语句:根据条件为真时,执行特定代码块。
    • else if 语句:如果前面的 ifelse if 的条件为假,将执行另一个条件的测试。
    • else 语句:如果所有的 ifelse if 条件都不满足,将执行 else 块中的代码。
    • switch 语句:根据变量的值来决定执行多个代码块中的哪一个。
  2. 循环语句(Loop Statements) - while, do-while, for 语句:

    • while 语句:在给定条件为真的情况下反复执行一个代码块。
    • do-while 语句:至少执行一次代码块,之后如果条件为真,则继续执行。
    • for 语句:允许在循环开始之前初始化变量,定义循环运行的条件,以及在每次循环迭代后更新变量。
  3. 跳转语句(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: 当所有条件都不为真时执行
}

只有第一个为真的条件对应的代码块会被执行。如果所有的 ifelse 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;
}
  1. expression:这是一个返回整型的表达式,switch 语句将根据这个表达式的结果决定执行哪一个 case

  2. case:这个关键字后面跟着一个与 expression 表达式可能等于的常量值。如果 expression 的结果与某个 case 后面的值匹配,控制流就会跳转到这个 case 语句块。

  3. break:这个关键字用于结束当前的 case 语句块,确保如果匹配了一个 case,程序就不会继续执行下一个 case 语句块。如果省略 break,程序将会继续执行下一个 case 的代码,不管它的条件是否满足,这称为“case 穿透”。

  4. 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语言中,breakcontinue 是控制循环行为的两个重要关键字,尤其在 while 循环中非常有用。它们用于改变循环的正常流程。

break

break 语句用于立即退出包围它的最近的循环(whilefordo-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 循环中,breakcontinue 允许在循环中改变执行流程。这两个语句在 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,但在内层循环之前并没有重新初始化。这意味着:

  1. 在第一次外层循环 (i=0) 时,j 从0开始,内层循环正常执行,直到 j 达到10(j 递增到10后,j<10 的条件不再成立,内层循环结束)。
  2. 当第二次外层循环开始时(i=1),j 的值仍然是10(没有重新设为0),所以内层循环的条件 j<10 已经不成立,内层循环根本不执行。
  3. 对于所有后续的外层循环迭代 (i=2i=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);
  • 循环体:放置在 dowhile 之间的是循环体,它包含了需要重复执行的代码块。
  • 条件:放在 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 循环中,breakcontinue 语句用于控制循环的执行流程,就像它们在其他循环结构(如 forwhile 循环)中的作用一样。

break 语句

do...while 循环中,break 语句用于立即终止循环,即使循环条件仍然为真。当执行到 break 语句时,循环停止,控制流跳转到 do...while 循环后的下一条语句。

示例:使用 breakdo...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 语句适用于跳过某些特定条件下的迭代,而不是完全退出循环。

示例:使用 continuedo...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 可以减少代码的复杂度并提高代码质量。

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TENET-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值