【C语言基础篇】结构控制(下)转向语句break、continue、goto、return

简介: 【C语言基础篇】结构控制(下)转向语句break、continue、goto、return


C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构。也就是说在C语言所有的代码都是这三种结构。

本篇文章将会着重讲解转向语句break、continue和goto语句的使用

关于C语言三种结构的详细讲解请阅读前两篇文章

【C语言基础篇】结构控制(上)顺序结构和选择结构-CSDN博客

【C语言基础篇】结构控制(中)循环结构-CSDN博客

 

转向语句用来直接控制程序的执行流程从而改变循环结构、选择结构以及函数的正常执行流程

这些语句在编写程序时常被用到,特别是当循环体内部分支比较复杂时,可用于简化分支语句的条件,减少条件分支语句if的嵌套深度及分支数,使程序更易阅读和理解。

在编写代码时,应根据实际需求选择合适的转向语句,并确保代码的可读性和可维护性

(但goto语句尽量少用,因为这不利于结构化程序设计,滥用它会使程序流程无规律、可读性差,稍后会在文章中介绍)

一、break语句

break 的作用是用于跳出switch结构或循环结构,只要 break 被执行,直接就会跳出循环或switch代码块,继续往后执执行。

当有break语句位于多重循环的内循环中,它只能跳出内循环,即只能跳出一层循环

下面以打印1-10的数字为例,分别展示break在三种循环中的使用和效果

1. break在 while 循环中

#include <stdio.h>
int main()
{
  int i = 1;
  while (i <= 10)
  {
    if (i == 5)
      break;   //当i=5时,break跳出循环,结束打印
    printf("%d ", i); //打印结果为1 2 3 4
    i++;
  }
  return 0;
}

2. break在 for 循环中

#include<stdio.h>
int main()
{
  for (int i = 1; i <= 10; i++)
  {
 
    if (i == 5)
      break;  //当i=5时,break跳出循环,结束打印
    printf("%d ", i);//打印结果为1 2 3 4
  }
  return 0;
}

 

3. break在 do…while 循环中

#include<stdio.h>
int main()
{
  int i = 1;
  do
  {
    if (i == 5)
      break;//当i=5时,break跳出循环,结束打印
    printf("%d ", i);//打印结果为1 2 3 4
    i++;
  } while (i <= 10);
  return 0;
}

4. break在 switch 语句中

break对于switch语句的作用不同于三种循环——

break在switch中属于是必不可少的选项。在switch中,case相当于switch的入口,break相当于switch的出口。如果没有在某个case后面没有break语句,代码会继续往下执行,有可能执行其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束

比如下面这个例子,输入一个数字打印周几,正常情况下应该是每个case跟一句break,这样能做到“一进一出”

#include<stdio.h>
int main()
{
  int day = 0;
  scanf("%d", &day);
  switch (day)
  {
  case 1:
    printf("周一\n");
    break;
  case 2:
    printf("周二\n");
    break;
  case 3:
    printf("周三\n");
    break;
  case 4:
    printf("周四\n");
    break;
  case 5:
    printf("周五\n");
    break;
  case 6:
    printf("周六\n");
    break;
  case 7:
    printf("周日\n");
    break;
  }
  return 0;
}

比如输入一个数字2,就会输出周二

如果去掉break语句,再输入一个数字2。就会看到程序从case 2进入之后,直到整个switch语句执行完才结束

#include<stdio.h>
int main()
{
  int day = 0;
  scanf("%d", &day);
  switch (day)
  {
  case 1:
    printf("周一\n");
  case 2:
    printf("周二\n");
  case 3:
    printf("周三\n");
  case 4:
    printf("周四\n");
  case 5:
    printf("周五\n");
  case 6:
    printf("周六\n");
  case 7:
    printf("周日\n");
  }
  return 0;
}

 

当然,break在switch语句中不一定要在每一条case语句后面出现

当需要多个case入口共用一段代码和出口,就可以省略break。

比如下面这种情况

#include<stdio.h>
int main()
{
  int day = 0;
  scanf("%d", &day);
  switch (day)
  {
  case 1:
  case 2:
  case 3: 
  case 4:
  case 5:
    printf("工作日\n");
    break;
  case 6:
  case 7:
    printf("周末\n");
    break;
  }
  return 0;
}

5. break 总结

break用于循环结构中时,在while循环、for循环和do...while循环中的使用方法和效果相同。

都是在满足某个条件时,使用break跳出循环,不再执行未完成的循环语句。不过要注意,break只能跳出一层循环,如果要跳出多层循环,需要在对应的每层循环中使用break语句。

break用于switch结构时一般情况下,每条case语句和default语句都需要有对应的break语句。但需要多个case语句共用一个“出口”时,只在最后一个入口的后面跟随break语句

二、continue语句

continue的作用时在循环结构中,根据某个判断条件结束本次循环,即循环体中continue语句后边的部分不再执行,直接进入下一次循

下面依然以打印1-10的数字为例,分别展示continue在三种循环中的使用和效果

1. continue在 while 循环中

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

当i=5时,continue跳出本次循环,但由于跳过了循环变量调整部分,导致了死循环

打印结果为1 2 3 4...死循环(可以看到控制台的光标一直在闪烁

 

2. continue在 for 循环中

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

当i=5时,continue跳出本次循环,进入到循环变量调整和循环条件判断部分(因为for循环的循环变量调整部分是单独拿出来的,所以没有像while循环中使用continue一样进入死循环)

打印结果为1 2 3 4 6 7 8 9 10

 

3. continue在 do...while 循环中

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

当i=5时,continue跳出本次循环,但由于跳过了循环变量调整部分,所以和上面的while循环一样,导致了死循环

打印结果为1 2 3 4...死循环

4. continue 总结

continue在三种循环中的使用方法都是相同的——在满足某种条件时,使用continue跳过每次循环后面的代码,直接进入下一次循环

但continue在三种循环中的使用效果有所不同

  • 在while循环和do...while循环中,如果continue刚好跳过了循环变量调整部分,将会导致死循环
  • 而在for循环中,由于循环变量调整部分是单独拿出来的,所以使用continue不会导致死循环

 

三、goto语句

goto语句也称为无条件转移语句,在C语言是⼀种非常特别的语法,goto 语句和语句标号配合使用, 可以实现在同⼀个函数内跳转到设置好的标号处。

C语言不限制程序中使用标号的次数,但各标号不得重名。goto 语句的语义是改变程序流向, 转去执行语句标号所标识的语句

goto 语句通常与选择语句配合使用,比如 if 语句。可用来实现条件转移, 构成循环,跳出循环体等功能。但是要注意,goto语句与 if 语句构成的循环,是无法用break打破的

所以在结构化程序设计中一般不主张使用 goto 语句来强制改变程序的走向, 以免造成程序流程的混乱,使理解和调试程序都产生困难。

goto语句的使用格式如下

goto 语句标号;

.........

语句标号:

........

goto语句使用示例

#include<stdio.h>
int main()
{
  int i = 1;
  while (i <= 10)
  {
    if (i == 5)
      goto exit;
    printf("%d ", i);
    i++;
  }
exit:
  printf("\n");
  return 0;
}

程序执行结果如下

goto 语句如果使用不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以我们的建议是能不用尽量不去使用;

但是 goto 语句也不是一无是处,在多层循环的代码中,如果想快速跳出,使用 goto 就非常的⽅便了

for(...)
{
    for(...)
    {
        for(...)
        {
            if(disaster)
                goto error;
        }
    }
}
error:
//...

 

四、return语句

在C语言中,return语句用于从函数中返回。

当程序执行到函数中的return语句时,函数的执行会立即结束,返回到调用该函数的地方。return语句可以带有一个表达式,该表达式的值将作为函数的返回值。

如果return语句没有表达式,那么函数返回的值是未定义的。

  1. 函数必须有返回值类型,除了void类型的函数。void类型的函数不返回任何值,因此不需要return语句。
  2. 函数可以有多个return语句,以便在不同的条件下返回不同的值。但是,一旦执行到return语句,函数就会立即结束,后面的代码不会被执行。
  3. 如果函数没有return语句,那么函数会在最后一行隐式地返回一个值。对于main函数,这个隐式返回值通常是0,表示程序正常结束。对于其他函数,这个隐式返回值是未定义的,因此应该避免使用没有return语句的函数。
  4. 如果函数的返回类型是指针类型,那么return语句可以返回一个指针。在这种情况下,需要确保返回的指针是有效的,以避免潜在的内存访问错误。

1. void类型函数 无需返回值和return语句

void print(int num)
{
  for (int i = 0; i <= i; i++)
  {
    printf("%d ", i);
  }
}

2.多个return语句作为不同情况下的返回值

int max(int a, int b)
{
  if (a > b)
    return a;
  else
    return b;
}

3.应返回值的函数没有return语句

#include<stdio.h>
int max(int a,int b)
{
 
}
int main()
{
  int m = 1, n = 2;
  printf("%d", max(m, n));
 
}

main函数的返回值默认为0

其他函数的返回值时一个随机值

 

4.函数的返回值是指针类型

int* add(int m, int n)
{
  int *result= (int*)malloc(sizeof(int) * 2);
  result[0] = m;
  result[1] = n;
  return result;
}

五、转向语句总结

C语言中,转向语句有break、continue、goto、return四种,分别有着不同的使用方法和效果

  1. break可用于循环结构或switch结构中。用于循环结构时,会立即跳出该层循环;用于switch结构时,作为不同分支的出口,跳出switch结构
  2. continue用于循环结构中根据某个判断条件结束本次循环,跳过本次循环后面的代码,直接进入下一次循环。不过要注意,continue用于while循环和do...while循环中,可能会跳过循环变量调整部分,导致死循环。
  3. goto语句与相应的语句标号配合使用,用改变程序流向, 转去执行语句标号所标识的语句在结构化程序设计中一般不主张使用 goto 语句来强制改变程序的走向, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
  4. return语句用于函数中当程序执行到函数中的return语句时,函数的执行会立即结束,return语句后跟随的表达式将作为函数的返回值。

如若您发现文章存在错误,还望多多指正 

目录
打赏
0
0
0
0
17
分享
相关文章
|
2月前
|
【C语言】break 关键字详解
- `break` 关键字用于提前退出循环体或 `switch` 语句的执行。 - 在 `for`、`while` 和 `do-while` 循环中,`break` 可以帮助程序在满足特定条件时退出循环。 - 在 `switch` 语句中,`break` 用于终止 `case` 代码块的执行,避免代码“穿透”到下一个 `case`。 - 注意 `break` 只会退出最内层的循环或 `switch` 语句,确保在嵌套结构中正确使用 `break` 以避免意外的控制流行为。
150 2
【C语言】结构体内存对齐:热门面试话题
【C语言】结构体内存对齐:热门面试话题
151 0
【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】
分支的语句,这可能不是预期的行为,这种现象被称为“case穿透”,在某些特定情况下可以利用这一特性来简化代码,但在大多数情况下,需要谨慎使用。编写一个程序,该程序需输入个人数据,进而预测其成年后的身高。根据提示,在右侧编辑器补充代码,计算并输出最终预测的身高。分支下的语句,提示用户输入无效。常量的值必须是唯一的,且在同一个。语句的作用至关重要,如果遗漏。开始你的任务吧,祝你成功!,程序将会继续执行下一个。常量都不匹配,就会执行。来确保程序的正确性。
52 10
|
1月前
|
【C语言程序设计——基础】顺序结构程序设计(头歌实践教学平台习题)【合集】
目录 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果: 任务描述 相关知识 编程编写一个程序,从键盘输入3个变量的值,例如a=5,b=6,c=7,然后将3个变量的值进行交换,使得a=6,b=7,c=5。面积=sqrt(s(s−a)(s−b)(s−c)),s=(a+b+c)/2。使用输入函数获取半径,格式指示符与数据类型一致,实验一下,不一致会如何。根据提示,在右侧编辑器补充代码,计算并输出圆的周长和面积。
39 10
【C语言程序设计——选择结构程序设计】求一元二次方程的根(头歌实践教学平台习题)【合集】
本任务要求根据求根公式计算并输出一元二次方程的两个实根,精确到小数点后两位。若方程无实根,则输出提示信息。主要内容包括: - **任务描述**:使用求根公式计算一元二次方程的实根。 - **相关知识**:掌握 `sqrt()` 函数的基本使用方法,判断方程是否有实根。 - **编程要求**:根据输入的系数,计算并输出方程的根或提示无实根。 - **测试说明**:提供两组测试数据及预期输出,确保代码正确性。 - **通关代码**:包含完整的 C 语言代码示例,实现上述功能。 通过本任务,你将学会如何处理一元二次方程的求解问题,并熟悉 `sqrt()` 函数的使用。
31 5
【C语言程序设计——选择结构程序设计】按从小到大排序三个数(头歌实践教学平台习题)【合集】
本任务要求从键盘输入三个数,并按从小到大的顺序排序后输出。主要内容包括: - **任务描述**:实现三个数的排序并输出。 - **编程要求**:根据提示在编辑器中补充代码。 - **相关知识**: - 选择结构(if、if-else、switch) - 主要语句类型(条件语句) - 比较操作与交换操作 - **测试说明**:提供两组测试数据及预期输出。 - **通关代码**:完整代码示例。 - **测试结果**:展示测试通过的结果。 通过本任务,你将掌握基本的选择结构和排序算法的应用。祝你成功!
36 4
|
2月前
|
【C语言】continue 关键字详解
`continue` 关键字在 C 语言中用于跳过当前循环中的剩余代码,并立即开始下一次迭代。它主要用于控制循环中的流程,使程序在满足特定条件时跳过某些代码。
164 1
【C语言】continue 关键字详解
【C语言程序设计——选择结构程序设计】求阶跃函数的值(头歌实践教学平台习题)【合集】
本任务要求输入x的值,计算并输出特定阶跃函数的结果。主要内容包括: 1. **选择结构基本概念**:介绍if、if-else、switch语句。 2. **主要语句类型**:详细解释if、if-else、switch语句的使用方法。 3. **跃迁函数中变量的取值范围**:说明如何根据条件判断变量范围。 4. **计算阶跃函数的值**:通过示例展示如何根据给定条件计算函数值。 编程要求:在右侧编辑器Begin-End之间补充代码,实现阶跃函数的计算和输出。测试说明提供了多个输入及其预期输出,确保代码正确性。最后提供通关代码和测试结果,帮助理解整个过程。
32 0
【C语言程序设计——选择结构程序设计】判断一个数是不是5和7的倍数(头歌实践教学平台习题)【合集】
本任务要求输入一个正整数,判断其是否同时是5和7的倍数,若是输出&quot;Yes&quot;,否则输出&quot;No&quot;。内容涵盖选择结构的基本概念、主要语句类型(if、if-else、switch)及条件判断逻辑,帮助理解编程中的分支执行与条件表达式。测试用例包括正数、负数及非倍数情况,确保代码逻辑严谨。通关代码示例如下: ```cpp #include &quot;stdio.h&quot; int main(){ int a; scanf(&quot;%d&quot;, &a); if (a &lt;= 0){ printf(&quo
48 0
【C语言程序设计——选择结构程序设计】求输入的日期是该年的第几天(头歌实践教学平台习题)【合集】
本任务要求编写程序,根据用户输入的年月日(以空格或回车分隔),计算并输出该天是该年的第几天,需注意判断闰年。主要内容包括: 1. **任务描述**:实现从键盘输入年月日,计算该天是当年的第几天。 2. **相关知识**: - `switch` 结构的基本语法及使用注意事项。 - 判断闰年的条件:能被4整除但不能被100整除,或能被400整除的年份为闰年。 3. **编程要求**:根据提示补充代码,确保程序正确处理输入并输出结果。 4. **测试说 示例代码展示了如何使用 `switch` 语句和闰年判断逻辑来完成任务。通过此练习,掌握 `switch` 语句的应用及闰年判断方法。
29 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等