『C语言入门』分支和循环语句

文章目录

  • 引言
  • 一、什么是语句?
    • 1.1表达式语句
    • 1.2赋值语句
    • 1.3函数调用语句
    • 1.4复合语句
    • 1.5空语句
    • 1.6控制语句
  • 二、分支语句
    • 2.1 `if`语句
      • 2.1.1基本语法
      • 2.1.2使用`else`语句
      • 2.1.3嵌套if语句
      • 2.1.4多层`if-else`语句
    • 2.2 `switch`语句
      • 2.2.1基本语法
      • 2.2.2示例
      • 2.2.3穿透
  • 三、循环语句
    • 3.1`for`循环
      • 3.1.1`break`和`continue`
      • 3.1.2循环控制变量
      • 3.1.3循环变种
    • 3.2`while`循环
      • 3.2.1语法
      • 3.2.2工作原理
      • 3.2.3常见用法
      • 3.2.4`break`语句与`continue`
    • 3.3`do-while`循环
      • 3.3.1语法
      • 3.3.2工作原理
      • 3.3.3常见用法
      • 3.3.4`break`语句与`continue`
    • 3.4`goto`语句
      • 3.4.1基本语法
      • 3.4.2示例
      • 3.4.3优点
      • 3.4.4缺点
      • 3.4.5替代方案
  • 总结

引言

在编程中,我们需要让程序根据不同情况作出选择,并重复执行某些任务。C语言的分支和循环结构为实现这些目标提供了强大的工具。本文将探索C语言中的分支(如ifswitch)以及循环(如whilefordo...while)结构,帮助你理解如何更有效地控制程序的流程和逻辑。无论你是初学者还是有经验的开发者,这些知识都将为你的编程旅程增添价值。

一、什么是语句?

在编程中,语句是构成程序的基本元素之一,它们代表了计算机需要执行的指令或操作。语句是程序中的操作单位,通过组合不同类型的语句,我们可以构建出复杂的程序逻辑和功能。在C语言中,语句可以分为多种类型,包括表达式语句赋值语句条件语句等,每种类型都有其特定的作用和用法。

让我们来看一些常见的C语言语句示例,以便更好地理解语句的概念:

1.1表达式语句

表达式是由运算符、操作数和函数调用组成的计算式,表达式语句通常用于执行一些计算操作,但它的结果通常不会被使用。

例如:

x = y + z;    // 赋值表达式
result = a * b + c;    // 数学表达式

1.2赋值语句

赋值语句用于将一个值赋给变量,从而更新变量的内容。这在程序中经常用于存储数据和计算结果。

例如:

num = 10;    // 将值10赋给变量num
total = total + price;    // 将total和price的和赋给total

1.3函数调用语句

函数是一段预定义的代码块,通过函数调用语句,我们可以执行函数内的操作。函数调用语句通常用于完成特定的任务,例如输入输出、数学计算等。

例如:

printf("Hello, world!");    // 调用printf函数输出文本
scanf("%d", &value);    // 调用scanf函数读取用户输入的整数

1.4复合语句

复合语句是一组由花括号({})括起来的语句,它们被视为一个单元。复合语句可以包含多种类型的语句,用于组织和控制代码的执行。

例如:

{int x = 5;printf("The value of x is %d\n", x);
}

1.5空语句

空语句是指不包含任何操作的语句,它通常用于语法要求需要一条语句但不需要实际操作的情况。空语句只包含一个分号。

例如:

;    // 空语句

1.6控制语句

控制语句是编程中的关键工具,用于管理程序的执行流程和实现不同的程序结构。在C语言中,控制语句分为三类:

  1. 条件判断语句(分支语句):这类语句允许根据不同的条件选择不同的执行路径。其中包括:
    • if语句:根据条件执行代码块,可以包含一个else块,用于处理条件不满足的情况。
    • switch语句:基于表达式的值跳转到不同的case分支,可以实现多条件的选择。
  2. 循环执行语句:这类语句允许反复执行一段代码,直到满足特定条件为止。包括:
    • do while语句:先执行一次代码块,然后根据条件反复执行。
    • while语句:在循环开始之前判断条件是否满足,满足则执行循环体内代码。
    • for语句:在循环开始之前初始化计数器,根据条件和更新规则反复执行代码块。
  3. 转向语句:这类语句用于控制程序的跳转。包括:
    • break语句:在循环或switch语句中提前终止循环或跳出switch。
    • continue语句:跳过当前循环迭代的剩余部分,进入下一次迭代。
    • return语句:从函数中返回值,并终止函数的执行。
    • goto语句:尽管不推荐使用,但可以无条件地跳转到代码中的标签位置。

本文主要介绍控制语句。

每个语句都以分号(;)结尾,表示语句的结束。在编写程序时,正确使用分号是非常重要的,因为它们告诉编译器何时一个语句结束,何时开始下一个语句。

二、分支语句

分支语句是C语言中的重要控制结构之一,它允许程序根据不同的条件选择不同的执行路径。通过分支语句,你可以实现有条件的程序执行,从而使程序更具智能和灵活性。C语言中的分支语句主要包括if语句和switch语句。

2.1 if语句

在C语言中,if语句是一种重要的条件判断语句,它允许根据条件的真假执行不同的代码块,从而实现有条件的程序执行。if语句的灵活性使得我们可以根据不同的情况选择不同的程序路径,使程序更加智能和逻辑清晰。

2.1.1基本语法

if语句的基本语法如下:

if (条件) {// 如果条件为真,执行这里的代码
}
  • 条件是一个布尔表达式或可求值为布尔值的表达式。如果条件的值为真(非零),则执行花括号内的代码块;如果条件的值为假(零),则跳过这个代码块,继续执行后续的代码。

下面是一个简单的例子,演示了如何使用if语句:

#include <stdio.h>int main() {int num;printf("Enter an integer: ");scanf("%d", &num);if (num > 0) {printf("%d is positive.\n", num);}printf("Program finished.\n");return 0;
}

在这个例子中,用户被要求输入一个整数。程序使用if语句检查输入的整数是否为正数。如果是正数(即条件num > 0为真),则输出相应的信息;否则,直接跳过输出部分,继续执行后续代码。

2.1.2使用else语句

除了基本的if语句外,你还可以使用else来指定在条件不满足时执行另一段代码块:

#include <stdio.h>int main() {int num;printf("Enter an integer: ");scanf("%d", &num);if (num > 0) {printf("%d is positive.\n", num);} else {printf("%d is not positive.\n", num);}printf("Program finished.\n");return 0;
}

在这个例子中,根据用户输入的整数,程序会输出相应的信息,要么是正数,要么是不是正数。else语句使你能够在两个不同的可能性之间做出选择。

2.1.3嵌套if语句

你还可以在一个if语句内嵌套另一个if语句,以处理更复杂的条件情况:

#include <stdio.h>int main() {int num;printf("Enter an integer: ");scanf("%d", &num);if (num > 0) {printf("%d is positive.\n", num);} else {if (num < 0) {printf("%d is negative.\n", num);} else {printf("%d is zero.\n", num);}}printf("Program finished.\n");return 0;
}

在这个例子中,根据用户输入的整数,程序会输出正数、负数或零的信息。这利用了嵌套的if语句来处理不同的情况。

2.1.4多层if-else语句

在实际编程中,经常会遇到需要同时判断多个条件的情况。为了处理这样的复杂情况,你可以使用多层if-else语句来实现不同条件下的不同操作。多层if-else语句能够有效地组合和嵌套条件判断,以处理多重条件。

多层if-else语句的基本语法如下:

if (条件1) {// 条件1为真时执行的代码
} else if (条件2) {// 条件2为真时执行的代码
} else if (条件3) {// 条件3为真时执行的代码
} else {// 所有条件均不满足时执行的代码
}

**这种结构允许你根据多个条件逐个判断,直到找到第一个满足条件的分支,然后执行相应的代码块。**如果所有条件都不满足,最后的else代码块将会执行。

以下示例展示了多层if-else语句的使用:

#include <stdio.h>int main() {int score;printf("Enter your score: ");scanf("%d", &score);if (score >= 90) {printf("Grade: A\n");} else if (score >= 80) {printf("Grade: B\n");} else if (score >= 70) {printf("Grade: C\n");} else if (score >= 60) {printf("Grade: D\n");} else {printf("Grade: F\n");}return 0;
}

在这个例子中,根据用户输入的分数,程序使用多层if-else语句来判断其所在的分数段,并输出相应的等级。根据分数的不同,程序会在不同的条件分支中选择执行。

多层if-else语句能够清晰地表达多重条件判断的逻辑,使得程序结构更加直观和易于理解。当你需要处理多个条件时,将多个if-else分支组合在一起,可以有效地构建复杂的程序逻辑。

if语句是实现有条件的程序执行的重要工具。无论是输入验证还是多重条件判断,合理地使用不同形式的if语句,都可以使程序的逻辑更加清晰和智能。

2.2 switch语句

在C语言中,switch语句是一种用于多重条件选择的控制语句。它允许根据表达式的值在多个case分支中选择执行不同的代码块。switch语句可以使程序更加简洁和易于理解,特别是当需要处理多个固定值时。

2.2.1基本语法

switch语句的基本语法如下:

switch (表达式) {case1:// 当表达式的值等于值1时,执行这里的代码break;case2:// 当表达式的值等于值2时,执行这里的代码break;// 更多case...default:// 如果表达式的值不匹配任何case时,执行这里的代码
}
  • 表达式是一个可求值的表达式,其值将与每个case标签进行比较。
  • 每个case标签后跟着一个需要匹配的值和一个冒号。
  • 如果表达式的值与某个case标签匹配,则会执行该case标签下的代码块。在执行完代码块后,可以通过使用break语句跳出switch语句,以防止进一步执行其他case块。如果没有break语句,程序将会继续执行下一个case

2.2.2示例

考虑以下示例,演示了如何使用switch语句处理不同运算符对应的操作:

#include <stdio.h>int main() {char operator;double num1, num2;printf("Enter an operator (+, -, *, /): ");scanf(" %c", &operator);printf("Enter two numbers: ");scanf("%lf %lf", &num1, &num2);switch (operator) {case '+':printf("%.2lf + %.2lf = %.2lf\n", num1, num2, num1 + num2);break;case '-':printf("%.2lf - %.2lf = %.2lf\n", num1, num2, num1 - num2);break;case '*':printf("%.2lf * %.2lf = %.2lf\n", num1, num2, num1 * num2);break;case '/':if (num2 != 0) {printf("%.2lf / %.2lf = %.2lf\n", num1, num2, num1 / num2);} else {printf("Error: Division by zero.\n");}break;default:printf("Invalid operator.\n");}return 0;
}

在这个示例中,用户首先被要求输入一个运算符,然后输入两个数字。程序使用switch语句根据运算符选择执行不同的计算,并输出结果。根据运算符的不同,程序会选择执行相应的case分支。

switch语句适用于当你需要根据多个固定选项来决定执行哪一段代码时。使用switch语句可以使代码结构更加整洁和易于维护。不过需要注意,在每个case分支中使用break语句来避免不必要的穿透

2.2.3穿透

在C语言的switch语句中,如果在一个case分支中没有使用break语句,那么程序将会“穿透”到下一个case分支中继续执行,而不会跳过后续的case。这种现象被称为“穿透”或“fall-through”。

考虑以下示例:

#include <stdio.h>int main() {int choice;printf("Enter a number between 1 and 3: ");scanf("%d", &choice);switch (choice) {case 1:printf("You chose 1.\n");case 2:printf("You chose 2.\n");case 3:printf("You chose 3.\n");default:printf("Invalid choice.\n");}return 0;
}

在这个例子中,如果用户输入的数字是1,程序会输出:

You chose 1.
You chose 2.
You chose 3.
Invalid choice.

这是因为在case 1的代码块中没有使用break语句,所以程序继续执行下一个case,以及后续的所有代码块,直到switch语句结束或遇到break为止。这就导致了穿透现象。

为了避免意外的穿透,通常在每个case分支的代码块末尾使用break语句。如果希望每个分支都执行独立的逻辑且不会穿透到其他分支,break语句是必要的。如果需要有意的穿透,可以有选择地省略break,但在这种情况下,需要特别小心以确保代码的预期行为。

三、循环语句

在学习编程的旅程中,掌握循环语句是至关重要的一步。C语言作为一门广泛应用的编程语言,提供了多种循环语句,用于处理重复性任务。本章节将帮助您逐步了解forwhiledo-while三种循环,为您的学习之路提供详细的指导。

3.1for循环

for循环通常用于在已知的次数范围内重复执行代码。它由三个关键部分组成:

  • 初始化:在循环开始前执行的语句,通常用于初始化计数器。
  • 条件:在每次循环迭代前检查的条件,如果条件为真,循环将继续执行。
  • 更新:在每次循环迭代后执行的语句,通常用于递增或递减计数器。

示例: 让我们使用for循环输出前10个自然数。

#include <stdio.h>int main() {for (int i = 1; i <= 10; i++) {printf("%d ", i);}return 0;
}

3.1.1breakcontinue

当在C语言的for循环中使用breakcontinue语句时,它们分别用于控制循环的中断和跳过。

break语句

break语句用于在循环内部中断循环的执行,无论循环条件是否满足。一旦break语句执行,循环将立即终止,程序将继续执行循环之后的代码。

示例: 使用break语句在for循环中找到第一个满足条件的数字并终止循环。

#include <stdio.h>int main() {for (int i = 1; i <= 10; i++) {if (i == 5) {printf("找到满足条件的数字:%d\n", i);break;  // 循环中断}}return 0;
}

continue语句

continue语句用于跳过当前循环迭代的剩余部分,并继续下一次迭代。它将不执行当前迭代中continue语句后面的代码,而是直接进入下一次循环迭代。

示例: 使用continue语句跳过某些特定数字的输出。

#include <stdio.h>int main() {for (int i = 1; i <= 10; i++) {if (i % 2 == 0) {continue;  // 跳过偶数}printf("%d ", i);}return 0;
}

在使用这些语句时,要注意它们的影响范围。break会立即中断循环,并退出循环体,而continue只是跳过当前迭代的剩余部分,然后继续下一次迭代。使用这些语句可以更灵活地控制循环的行为,使代码逻辑更加清晰和可读。

总之,break用于完全中断循环,而continue用于跳过当前迭代。这两个关键字在不同情况下能够帮助您更好地处理循环中的逻辑。

3.1.2循环控制变量

1. 不可在for循环体内修改循环变量,防止循环失去控制:

循环控制变量在for循环的初始化部分被定义,并在每次迭代后在更新部分进行更新。在循环体内修改循环控制变量可能会导致循环条件不再满足,从而导致循环行为出现问题,甚至导致无限循环。

示例: 错误的修改循环控制变量示例。

#include <stdio.h>int main() {for (int i = 1; i <= 5; i++) {printf("%d\n", i);i--;  // 错误:在循环体内修改循环控制变量return 0;
}

2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法:

使用“前闭后开区间”写法可以避免循环条件边界值的问题,同时也使得循环的行为更加清晰和容易理解。

示例: 使用“前闭后开区间”写法的for循环。

#include <stdio.h>int main() {// 从1到10(包括1,不包括10)for (int i = 1; i < 10; i++) {printf("%d\n", i);}return 0;
}

这种写法中,循环变量i的值从1开始,在条件部分使用<号,确保循环不会执行到10。

3. 合理选择循环控制变量的命名:

循环控制变量的命名应该具有描述性,可以使代码更具可读性。通常,使用简洁而有意义的变量名能够使代码更清晰地传达循环的意图。

示例: 使用描述性变量名的for循环。

#include <stdio.h>int main() {int num_of_students = 10;for (int student_id = 1; student_id <= num_of_students; student_id++) {printf("处理学生 %d\n", student_id);}return 0;
}

在这个示例中,循环控制变量student_id能够清楚地表示正在处理的学生编号。

3.1.3循环变种

C语言的for循环可以有多种变种,可以根据不同的需求和场景来适应不同的情况。

以下是一些常见的for循环变种示例:

1. 倒序循环:

通常,for循环是从一个初始值递增到一个结束值,但您也可以将其用于倒序循环。这可以通过递减循环控制变量来实现。

示例: 使用for循环倒序输出10到1的数字。

#include <stdio.h>int main() {for (int i = 10; i >= 1; i--) {printf("%d\n", i);}return 0;
}

2.无限循环:

有时候需要创建一个无限循环,可以在循环条件部分使用true或非零值来实现。

示例: 使用for循环创建无限循环,需要手动中断循环。

#include <stdio.h>int main() {for (;;) {printf("这是一个无限循环\n");// 添加适当的中断条件,如按下Ctrl+C}return 0;
}

3.多变量循环:

for循环可以在初始化部分同时初始化多个循环控制变量,并在更新部分对它们进行更新。

#include <stdio.h>int main() {for (int i = 1, j = 1; i <= 9; ) {printf("%d * %d = %d\n", i, j, i * j);j++;if (j > i) {i++;j = 1;}}return 0;
}

这些是for循环的一些常见变种,但还有更多的变种方式,可以根据实际需求进行适当调整。for循环是非常灵活的,可以用于各种不同的循环场景。根据不同的情况,选择适当的循环变种能够使您的代码更加简洁、高效和可读。

3.2while循环

在C语言中,while循环是一种强大的循环结构,它允许您在条件为真的情况下重复执行一段代码。相比于for循环,while循环更加灵活,适用于需要根据条件来动态控制循环次数的场景。让我们深入了解while循环的语法、工作原理以及一些常见的用法。

3.2.1语法

while (条件) {// 循环体代码
}

3.2.2工作原理

while循环会在每次循环开始之前,先判断条件是否为真。只要条件为真,循环体就会被执行。当循环体执行完毕后,会再次检查条件,然后决定是否继续下一次循环。如果条件为假,循环会终止,程序将继续执行循环之后的代码。

示例: 使用while循环计算用户输入数字的平方。

#include <stdio.h>int main() {int number, square;printf("请输入一个整数:");scanf("%d", &number);while (number != 0) {square = number * number;printf("数字 %d 的平方是 %d\n", number, square);printf("请输入一个整数:");scanf("%d", &number);}printf("循环结束,感谢使用!\n");return 0;
}

3.2.3常见用法

  1. 处理用户输入: 使用while循环可以反复获取用户输入,直到满足特定条件。
  2. 处理文件内容: 可以使用while循环逐行读取文件内容,直到文件结束。
  3. 动态计算: 当循环次数无法提前确定时,可以使用while循环根据条件来动态计算循环次数。
  4. 无限循环: 可以使用while (1)来创建无限循环,然后在适当条件下中断循环。
  5. 游戏循环: 游戏开发中常用的游戏循环就是基于while循环的。

while循环的灵活性使它在许多编程场景中非常有用。不过,与其他循环一样,要小心避免造成无限循环,确保循环条件能够在某个时刻为假,从而终止循环。

3.2.4break语句与continue

while循环中,同样可以使用breakcontinue语句来控制循环的流程。这些关键字在while循环中的作用与在其他循环类型中是类似的。

  1. break语句:

    break语句用于在while循环内部立即终止循环的执行,无论循环条件是否为真。当break语句被执行时,循环会立即结束,程序将继续执行循环之后的代码。

    示例: 使用while循环找到第一个满足条件的数字并终止循环。

    #include <stdio.h>int main() {int number = 1;while (number <= 10) {if (number == 5) {printf("找到满足条件的数字:%d\n", number);break;  // 循环中断}number++;}return 0;
    }
    
  2. continue语句:

    continue语句用于跳过当前循环迭代的剩余部分,直接进入下一次循环迭代。它会终止当前迭代的循环体部分,然后检查循环条件,决定是否继续下一次迭代。

    示例: 使用while循环输出奇数。

    #include <stdio.h>int main() {int i = 1;while (i <= 10) {if (i % 2 == 0) {i++;continue;  // 跳过偶数}printf("%d\n", i);i++;}return 0;
    }
    

breakcontinue语句在while循环中的作用与在其他循环中的作用相同。它们可以在循环内部实现条件跳出和跳过的需求,帮助您更精确地控制循环的执行流程。但请确保在使用它们时,不会导致无限循环或跳过循环的重要部分。

3.3do-while循环

do-while循环是C语言中的一种循环结构,它与while循环有些类似,但有一个重要区别:do-while循环会先执行一次循环体,然后在每次迭代结束后检查循环条件是否满足。让我们深入了解do-while循环的语法、工作原理以及一些常见的应用场景。

3.3.1语法

do {// 循环体代码
} while (条件);

3.3.2工作原理

do-while循环会首先执行一次循环体中的代码,然后检查循环条件是否为真。只要条件为真,循环会继续迭代,继续执行循环体,然后再次检查循环条件。如果条件为假,循环将终止,程序将继续执行循环之后的代码。

示例: 使用do-while循环获取用户输入,直到输入合法为止。

#include <stdio.h>int main() {int number;do {printf("请输入一个正整数:");scanf("%d", &number);} while (number <= 0);printf("您输入的是:%d\n", number);return 0;
}

3.3.3常见用法

  1. 用户输入验证: 使用do-while循环可以确保用户至少输入一次,并在每次迭代中验证输入的有效性。
  2. 菜单选择: 在菜单选择等场景中,do-while循环可用于持续显示选项并等待用户选择,直到用户选择退出。
  3. 处理用户反馈: 可以使用do-while循环获取用户反馈,然后根据反馈决定是否继续执行。
  4. 模拟游戏轮次: 游戏中的回合制操作可以使用do-while循环来实现。

do-while循环确保循环体至少会被执行一次,适用于需要在循环前执行一些操作的情况。要注意,循环条件必须在循环体的结尾处,这确保了至少执行一次循环体。

3.3.4break语句与continue

  1. break语句

    break语句用于在do-while循环内部立即终止循环的执行,无论循环条件是否为真。当break语句被执行时,循环会立即结束,程序将继续执行循环之后的代码。

    示例: 使用do-while循环找到第一个满足条件的数字并终止循环。

    #include <stdio.h>int main() {int number = 1;do {if (number == 5) {printf("找到满足条件的数字:%d\n", number);break;  // 循环中断}number++;} while (number <= 10);return 0;
    }
    
  2. continue语句

    continue语句用于跳过当前循环迭代的剩余部分,直接进入下一次循环迭代。它会终止当前迭代的循环体部分,然后重新开始新的迭代。

    示例: 使用do-while循环输出奇数。

    #include <stdio.h>int main() {int i = 1;do {if (i % 2 == 0) {i++;continue;  // 跳过偶数}printf("%d\n", i);i++;} while (i <= 10);return 0;
    }
    

breakcontinue语句在do-while循环中的作用与在其他循环中的作用相同。它们都可以用于在循环内部实现条件跳出和跳过的需求,帮助您更灵活地控制循环的执行流程。确保在使用它们时,不会导致无限循环或跳过循环的重要部分。

3.4goto语句

goto语句是C语言中的一种跳转语句,它允许直接跳转到程序中的另一个标签(或标识符)位置。然而,值得注意的是,使用goto语句可能会导致代码变得难以理解和维护,因此在编程中应谨慎使用。

3.4.1基本语法

在C语言中,goto语句的基本语法如下:

goto label;
// ...
label:
// 代码段

上述代码会将程序的控制流从goto语句跳转到标签label所在的位置

3.4.2示例

当涉及到goto语句的使用示例时,我们可以考虑一个简单的错误处理场景。假设我们正在编写一个函数,该函数从文件中读取数据,如果读取失败,则需要进行错误处理。

以下是一个使用goto语句的简单示例:

#include <stdio.h>int main() {FILE *file = fopen("data.txt", "r");if (file == NULL) {printf("Failed to open the file.\n");goto error;}// 读取文件中的数据// ...fclose(file);return 0;error:// 错误处理逻辑printf("An error occurred.\n");return 1;
}

在上面的示例中,如果文件无法打开,程序将跳转到标签error处进行错误处理。这种情况下,goto语句可以帮助我们在错误发生时避免重复编写错误处理逻辑。

3.4.3优点

尽管goto语句在现代编程实践中受到质疑,但它在某些特定情况下仍然可以提供帮助:

  1. 错误处理: 在处理错误时,goto语句可以让您跳转到一个共享的错误处理代码块,以避免在每个错误检查点都重复编写相同的错误处理逻辑。
  2. 复杂的跳转逻辑: 有时,一些算法或逻辑可能需要复杂的跳转路径,而goto可以使这些逻辑更清晰地表达。

3.4.4缺点

然而,goto语句的使用也带来了一些严重的问题:

  1. 可读性差: 使用goto语句可能会导致代码变得难以理解。由于它允许在不同的位置之间跳转,程序的执行流程可能会变得令人困惑。
  2. 维护困难: 当代码库变大并且多人协作时,使用goto语句可能会导致难以维护的代码。在不同的地方使用goto语句会使代码变得难以跟踪和调试。
  3. 可能导致悬挂指针: 如果不小心使用goto语句,可能会导致指针悬挂,即指针指向了未初始化或已释放的内存区域。

3.4.5替代方案

尽管goto语句在一些情况下可能有用,但在现代编程中,通常更推荐使用结构化的控制流语句,如ifwhilefor等,来实现逻辑和控制流。

总结

当涉及到控制流语句在C语言中的使用时,我们深入探讨了几种关键的语句:for循环、switch语句、while循环、do-while循环以及goto语句。每种语句都有其独特的优势和适用情况,但在实际编程中,我们需要根据具体情况来选择最适合的控制流结构。

  • for 循环是在已知循环次数的情况下的首选。它的结构清晰,对于循环次数明确的情况下非常有用。
  • switch 语句在多个选项中进行选择时非常有用。它可以将不同的情况映射到不同的代码块,使代码更具可读性。
  • while 循环用于在条件为真的情况下重复执行代码。它适用于需要循环直到某个条件不满足的情况。
  • do-while 循环与 while 循环类似,但它保证循环体至少被执行一次。这对于需要先执行循环体再进行条件检查的场景很有用。
  • goto 语句是一种无条件跳转工具,尽管它可能在某些情况下有用,但在现代编程中通常应避免使用,以确保代码的可读性和维护性。

正确选择适当的控制流结构是编写高质量代码的关键一步。无论是迭代次数已知还是需要进行多路分支选择,我们都应根据代码的逻辑和需求来选择合适的结构。同时,结构化的控制流语句有助于提高代码的可读性和维护性,从而促进更好的编程实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/51322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RD35M22AT、RD35M22BL、RD35M22DL插装式泄压阀

RD28M22AL、RD28M22BL、RD28M22CL、RD28M22DT、RD28M22AT、RD35M22AT、RD35M22BL、RD35M22DL、RD35M22WL插装式泄压阀 此结构在泄压时的压力非常稳定&#xff0c;若使用在低压时,请注意通过流量,不可超过35LPM。结构最大内漏量约(5滴/分, 设定压力的85%) 压力设定达到 210 ba…

数据库——redis过期时间

文章目录 Redis 给缓存数据设置过期时间有啥用&#xff1f;Redis是如何判断数据是否过期的呢&#xff1f;过期的数据的删除策略了解么&#xff1f; Redis 给缓存数据设置过期时间有啥用&#xff1f; 一般情况下&#xff0c;我们设置保存的缓存数据的时候都会设置一个过期时间。…

Vue组件的基本概念与使用

在Vue中&#xff0c;组件是构建用户界面的基本单元之一。它允许开发者将界面拆分为独立、可重用的模块&#xff0c;使代码更加结构化、易于维护。本文将从简单到复杂&#xff0c;全面介绍Vue组件的各种用法、优点、缺点以及注意事项。 组件的基本概念 组件是Vue的核心概念之一…

深入理解API接口:构建连接世界的桥梁

引言 随着互联网技术的迅速发展&#xff0c;应用程序界面&#xff08;API&#xff09;在现代软件开发中扮演着至关重要的角色。API充当了不同软件系统之间的桥梁&#xff0c;使它们能够相互通信、交换数据和协同工作。本文将深入探讨API接口的概念、设计原则以及在现代应用开发…

抖音seo矩阵系统源代码开发部署分享

一、 开发步骤分享 抖音SEO矩阵系统源代码开发部署分享&#xff0c;需要经验丰富的开发人员和服务器管理人员&#xff0c;以下是大致的步骤&#xff1a; 确定你需要的功能和设计&#xff0c;确定开发人员和设计师的角色和任务分配&#xff0c;以及开发进度和计划。 确定服务器…

SpringBoot 怎么返回html界面

方法一&#xff1a; &#xff08;1&#xff09;html文件要放在resource下的static目录下&#xff08;没有static 自己就创建一个文件夹&#xff09; &#xff08;2&#xff09;在application.yml 中配置视图解析器 spring:mvc:view:prefix: /suffix: .html &#xff08;3&a…

Java可视化物联网智慧工地SaaS平台源码:人脸识别考勤

基于微服务JavaSpring Cloud Vue UniApp MySql实现的智慧工地云平台源码 智慧工地是指利用云计算、大数据、物联网、移动互联网、人工智能等技术手段&#xff0c;为建筑施工现场提供智能硬件及物联网平台的解决方案&#xff0c;以实现建筑工地的实时化、可视化、多元化、智慧化…

❤ vue清除定时器Bug

❤ vue清除定时器Bug 页面加载&#xff0c;清除定时器 clearTimeout(intm) 问题 遇见的需求是&#xff1a;webapp 从A页面进入B页面,B页面点击按钮&#xff0c;加载完B页面的加载效果进入c&#xff0c;从C页面返回A页面&#xff0c;仍然显示B页面的加载效果 结果定时器一直…

[MyBatis系列②]Dao层开发的两种方式

目录 1、传统开发 1.1、代码 1.2、存在的问题 2、代理开发 2.1、开发规范 2.2、代码 ⭐mybatis系列①&#xff1a;增删改查 1、传统开发 传统的mybatis开发中&#xff0c;是在数据访问层实现相应的接口&#xff0c;在实现类中用"命名空间.id"的形式找到对应的映…

Elasticsearch 集成---框架集成SpringData-集成测试-索引操作

1.Spring Data 框架介绍 Spring Data 是一个用于简化数据库、非关系型数据库、索引库访问&#xff0c;并支持云服务的 开源框架。其主要目标是使得对数据的访问变得方便快捷&#xff0c;并支持 map-reduce 框架和云计 算数据服务。 Spring Data 可以极大的简化 JPA &a…

c语言 - 函数的基本用法及传参

函数 函数是一个完成特定功能的代码模块&#xff0c;其程 序代码独立&#xff0c;通常要求有返回值&#xff0c;也可以是 空值。一般形式如下: <数据类型><函数名称>( <形数说明> ) {语句序列&#xff1b;return[(<表达式>)];}函数的声明就是指函数原…

【Vue框架】 router和route是什么关系

前言 之前没太注意&#xff0c;写着写着突然发现它们貌似不太一样&#xff0c;记录以下&#xff0c;回顾的看总结就好。 1、总结✨ route&#xff1a;当前激活路由的对象&#xff0c;用于访问和操作当前路由的信息 router&#xff1a;管理多个route的对象&#xff0c;整个应…

windows下安装go环境 和vscode中go扩展

1. 首先安装GO Go下载地址&#xff1a;go.dev 选择相对应的版本&#xff0c;下载&#xff0c;运行安装程序&#xff0c;并打开命令提示符&#xff0c;运行 go env &#xff0c;确认已经安装go 注意关注其中GOPATH和GOROOT&#xff0c;这两个地址可以在系统环境变量中进行设置…

2023-08-24力扣每日一题

链接&#xff1a; 1267. 统计参与通信的服务器 题意&#xff1a; 同行同列可以发生通信&#xff0c;求能发生通信的机器数量 解&#xff1a; 标记每行/每列的机器个数即可 实际代码&#xff1a; #include<bits/stdc.h> using namespace std; class Solution { pub…

纸贵科技连续三年蝉联IDC中国 FinTech 50榜单

近日&#xff0c;国际权威市场研究机构IDC公布了“2023 IDC中国FinTech 50榜单”。作为领先的区块链技术和解决方案服务商&#xff0c;纸贵科技凭借过硬的区块链技术和丰富的金融科技创新成果&#xff0c;连续第三年荣登IDC中国FinTech 50榜单。 IDC中国FinTech 50榜单是金融科…

【Apollo】自动驾驶感知——毫米波雷达

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

在Mybatis中写动态sql这些标签:if、where、set、trim、foreach、choose的作用是什么,怎么用?

在 MyBatis 中&#xff0c;您可以使用动态 SQL 标签来构建灵活的 SQL 查询&#xff0c;以根据不同的条件生成不同的查询语句。以下是这些标签的作用和用法&#xff1a; 1. **<if> 标签&#xff1a;** 用于根据某个条件动态地包含或排除 SQL 片段&#xff0c;test:可以写…

单词搜索:在二维网格中寻找单词的存在

题目连接 链表主页 在本篇文章中&#xff0c;我们将深入探讨 LeetCode 题目 "203. 移除链表元素" 的解题方法&#xff0c;从问题的分析、解题思路、代码实现到核心知识点的罗列&#xff0c;带你逐步理解如何使用C来删除链表中所有满足指定值的节点&#xff0c;并返…

Python科研数据可视化

在过去的20 年中&#xff0c;随着社会产生数据的大量增加&#xff0c;对数据的理解、解释与决策的需求也随之增加。而固定不变是人类本身&#xff0c;所以我们的大脑必须学会理解这些日益增加的数据信息。所谓“一图胜千言”&#xff0c;对于数量、规模与复杂性不断增加的数据&…

Java小游戏

一、需求 二、思路一 HP当然是怪物的一个属性成员&#xff0c;而武器是角色的一个属性成员&#xff0c;类型可以使字符串&#xff0c;用于描述目前角色所装备的武器。角色类有一个攻击方法&#xff0c;以被攻击怪物为参数&#xff0c;当实施一次攻击时&#xff0c;攻击方法被调…