当前位置: 首页 > news >正文

『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 语句是一种无条件跳转工具,尽管它可能在某些情况下有用,但在现代编程中通常应避免使用,以确保代码的可读性和维护性。

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

相关文章:

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

文章目录 引言一、什么是语句&#xff1f;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穿透 三、循环语句…...

【给自己挖个坑】三维视频重建(NSR技术)-KIRI Engine

文章目录 以下是我和AI的对话通过手机拍摄物体的视频&#xff0c;再根据视频生成三维模型&#xff0c;这个可实现吗我想开发类似上面的手机应用程序&#xff0c;如何开发呢 看了以上回答&#xff0c;还是洗洗睡吧NSR技术的实现原理是什么呢有案例吗我是名Java工程师&#xff0c…...

Chrome历史版本下载和Selenium驱动版本下载

Python自动化必备&#xff1a; Selenium驱动版本下载 http://chromedriver.storage.googleapis.com/index.html Chrome浏览器历史版本下载 https://www.slimjet.com/chrome/google-chrome-old-version.php...

联合注入步骤

使用场景&#xff1a; 有回显&#xff0c;可以看到某些字段的回显信息 像下面的有具体的回显信息 一、判断注入位点 在原始的id&#xff08;参数&#xff09;的输入后面添加额外的条件 如果and 11 有结果&#xff0c;and10没有结果输出&#xff0c; 就说明我们添加的额外条件…...

后端项目开发:整合redis缓存

因为各种场合比如门户和后台&#xff0c;需要不同的redis配置&#xff0c;我们在common包配置通用的reids配置。 1.新建service目录&#xff0c;建立RedisService服务接口&#xff0c;同时编写工具类实现该接口。 public interface RedisService {/*** 保存属性*/void set(Str…...

美国访问学者签证好办吗?

近年来&#xff0c;随着国际交流与合作的不断深入&#xff0c;许多人对于美国访问学者签证的办理情况产生了浓厚的兴趣。那么&#xff0c;美国访问学者签证到底好办吗&#xff1f;让知识人网小编带您一起了解一下。 首先&#xff0c;美国作为世界上的科研、教育和创新中心之一&…...

Linux之基础IO文件系统讲解

基础IO文件系统讲解 回顾C语言读写文件读文件操作写文件操作输出信息到显示器的方法stdin & stdout & stderr总结 系统文件IOIO接口介绍文件描述符fd文件描述符的分配规则C标准库文件操作函数简易模拟实现重定向dup2 系统调用在minishell中添加重定向功能 FILE文件系统…...

Django主要特点

Django 是一个开源的 Python Web 开发框架&#xff0c;它提供了一系列的工具和功能&#xff0c;帮助开发人员快速、高效地构建 Web 应用程序。 以下是 Django 的一些主要特点&#xff1a; 1. 强大的 ORM&#xff08;对象关系映射&#xff09;&#xff1a; Django 提供了一个…...

element-ui中的el-table合并单元格

描述&#xff1a; 在写项目的时候有时候会经常遇到把行和列合并起来的情况&#xff0c;因为有些数据是重复渲染的&#xff0c;不合并行列会使表格看起来非常的混乱&#xff0c;如下&#xff1a; 而我们想要的数据是下面这种情况&#xff0c;将重复的行进行合并&#xff0c;使表…...

自组织地图 (SOM) — 介绍、解释和实现

自组织地图 &#xff08;SOM&#xff09; — 介绍、解释和实现 一、说明 什么是SOM&#xff08;self orgnize map&#xff09;自组织地图&#xff0c;是GNN类似的图神经网络的概念。因为神经网络实质上可以解释为二部图的权重&#xff0c;因此无论GNN还是SOM都有共同的神经网络…...

Arduino程序设计(四)按键消抖+按键计数

按键消抖按键计数 前言一、按键消抖二、按键计数1、示例代码2、按键计数实验 参考资料 前言 本文主要介绍两种按键控制LED实验&#xff1a;第一种是采用软件消抖的方法检测按键按下的效果&#xff1b;第二种是根据按键按下次数&#xff0c;四个LED灯呈现不同的流水灯效果。 一…...

Scrum Guide Chinese Simplified.pdf

敏捷指南...

Module not found: Error: Can‘t resolve ‘vue-pdf‘ in ‘xxx‘

使用命令npm run serve时vue项目报错&#xff1a; Module not found: Error: Cant resolve vue-pdf in xxx 解决方案&#xff1a; 运行命令&#xff1a; npm install vue-pdf --save --legacy-peer-deps 即可解决。 再次顺利执行npm run serve...

ELK之LogStash介绍及安装配置

一、logstash简介 集中、转换和存储数据 Logstash 是免费且开放的服务器端数据处理管道&#xff0c;能够从多个来源采集数据&#xff0c;转换数据&#xff0c;然后将数据发送到您最喜欢的“存储库”中。 Logstash 能够动态地采集、转换和传输数据&#xff0c;不受格式或复杂度的…...

docker学习(1)

1、容器与虚拟机的对比&#xff1a; 虚拟机&#xff08;virtual machine&#xff09;就是带环境安装的一种解决方案。 它可以在一种操作系统里面运行另一种操作系统&#xff0c;比如在Windows10系统里面运行Linux系统CentOS7。 应用程序对此毫无感知&#xff0c;因为虚拟机看…...

UE5 Niagara基础知识讲解

文章目录 前言官方文档发射器生成(Emitter Spawn)发射器更新(Emitter Update)Spawn Rate(生成速率)粒子生成(Particle Spawn)Initialize Particle(初始化粒子)粒子生命周期粒子颜色粒子大小Shape Location(形状位置)形状位置Add Velocity(添加速度)粒子速度Curl …...

缓存穿透、缓存击穿和缓存雪崩

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱发博客的嗯哼&#xff0c;爱好Java的小菜鸟 &#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&#x1f44d;一下博主哦 &#x1f4dd;社区论坛&#xff1a;希望大家能加入社区共同进步…...

自动化编排工具Terraform介绍(一)

Terraform是什么&#xff1f;: Terraform 是 HashiCorp 公司旗下的 Provision Infrastructure 产品, 是 AWS APN Technology Partner 与 AWS DevOps Competency Partner。Terraform 是一个 IT 基础架构自动化编排工具&#xff0c;它的口号是“Write, Plan, and Create …...

zhm_real/MotionPlanning运动规划库中A*算法源码详细解读

本文主要对zhm_real/MotionPlanning运动规划库中A*算法源码进行详细解读&#xff0c;即对astar.py文件中的内容进行详细的解读&#xff0c;另外本文是 Hybrid A * 算法源码解读的前置文章&#xff0c;为后续解读Hybrid A * 算法源码做铺垫。 astar.py文件中的源码如下&#xff…...

SpringMVC中Controller层获取前端请求参数的几种方式

SpringMVC中Controller层获取前端请求参数的几种方式 1、SpringMVC自动绑定2、使用RequestParam 注解进行接收3、RequestBody注解&#xff08;1&#xff09; 使用实体来接收JSON&#xff08;2&#xff09;使用 Map 集合接收JSON&#xff08;3&#xff09; 使用 List集合接收JSO…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...