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

news2025/1/12 12:29:18

文章目录

 一、break语句

1. break在 while 循环中

2. break在 for 循环中

3. break在 do…while 循环中

4. break在 switch 语句中

5. break 总结

二、continue语句

1. continue在 while 循环中 

2. continue在 for 循环中 

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

4. 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语句后跟随的表达式将作为函数的返回值。

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

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

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

相关文章

Kubernetes网络模型概述

Kubernetes网络模型设计的一个基础原则是&#xff1a;每个Pod都拥有一个独立的IP地址&#xff0c;并假定所有Pod都在一个可以直接连通的、扁平的网络空间中。所以不管这些Pod是否运行在同一个Node中&#xff0c;都要求它们可以直接通过对方的IP进行访问。由于Kubernetes的网络模…

C++泛型编程-类模板的项目实战实现基础的Vector的编写

请设计一个数组模板类&#xff08; Vector &#xff09;&#xff0c;完成对 int 、 char 、 float 、 double 以 及任意的自定义类等类型元素进行管理。 需求 a. 实现构造函数 b. 实现拷贝构造函数 c. 实现 cout << 操作 d. 实现下标访问符 [] 的重载操作 …

中仕教育:应届生可以考军队文职吗?有什么要求?

军队文职&#xff0c;涵盖了各个领域&#xff0c;包括行政、管理、人力资源、后勤等工作岗位&#xff0c;作为国家公务员的一种类型&#xff0c;军队文职同样享有稳定的工作和待遇。 虽然军队文职对所有符合条件的人开放&#xff0c;但对于应届生来说&#xff0c;还需满足以下…

企业Oracle1 数据库管理

Oracle的安装 一、基础表的创建 1.1 切换到scott用户 用sys 账户 登录 解锁scott账户 alter user scott account unlock;conn scott/tiger;发现并不存在scott账户&#xff0c;自己创建一个&#xff1f; 查找资料后发现&#xff0c;scott用户的脚本需要自己执行一下 C:\ap…

Spring:StopWatch

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、输出总耗时 二、输出所有任务的耗时和占比 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、输出总耗时 public void stopWatc…

【web 编程技术】基于 B/S 架构的电商平台(java web)

基于 B/S 架构的电商平台&#xff08;java web&#xff09; 课程设计实验目的课程设计实验环境课程设计功能概述课程设计需求分析三层架构图功能列表系统用例图系统活动图-用户端需求分析 课程设计详细设计实现过程数据库BaseServlet 的实现商品显示模块-分页显示所有商品、查看…

【网站项目】基于SSM的274办公自动化管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

安全防御-基础认知

目录 安全风险能见度不足&#xff1a; 常见的网络安全术语 &#xff1a; 常见安全风险 网络的基本攻击模式&#xff1a; 病毒分类&#xff1a; 病毒的特征&#xff1a; 常见病毒&#xff1a; 信息安全的五要素&#xff1a; 信息安全的五要素案例 网络空间&#xff1a…

flutter项目怎么判断是不是web平台?Unsupported operation: Platform._operatingSystem

如果你使用Platform 这个工具来判断的时候&#xff0c;很有可能会报错&#xff1a; Exception caught by widgets library The following UnsupportedError was thrown building MyApp(dirty): Unsupported operation: Platform._operatingSystem The relevant error-causin…

关于索引的最常见的十道面试题

面试题一&#xff1a;索引底层如何实现的&#xff1f; MySQL索引的底层实现是取决于存储引擎的&#xff0c;但是是大部分存储引擎底层都是通过B树实现的&#xff0c;以默认的存储InnoDB为例&#xff0c;底层就是通过B树实现的&#xff0c;如下图所示&#xff1a; B树是一种自平…

为什么C++17要引入std::string_view?

目录 1.引言 2.原理分析 2.1.结构 2.2.构造函数 2.3.成员函数 2.4.std::string_view字面量 3.实例 3.1.std::string_view和std::string的运算符操作 3.2.查找函数使用 3.3.std::string_view和临时字符串 4.总结 1.引言 在C/C日常编程中&#xff0c;我们常进行数据的…

elastic search入门

参考1&#xff1a;Elastic Search 入门 - 知乎 参考2&#xff1a;Ubuntu上安装ElasticSearch_ubuntu elasticsearch-CSDN博客 1、ElasticSearch安装 1.1安装JDK&#xff0c;省略&#xff0c;之前已安装过 1.2创建ES用户 创建用户&#xff1a;sudo useradd esuser 设置密码&…

多线程编程1

一、线程的引入 上节&#xff0c;我们介绍了进程的概念&#xff0c;以及操作系统内核是如何管理进程的&#xff08;描述组织&#xff09;&#xff0c;PCB中的核心属性有哪些&#xff0c; 引入进程这个概念&#xff0c;最主要的目的&#xff0c;就是为了解决“并发编程”这样的…

机器学习周记(第二十六周:文献阅读-DPGCN)2024.1.15~2024.1.21

目录 摘要 ABSTRACT 1 论文信息 1.1 论文标题 1.2 论文摘要 1.3 论文背景 2 论文模型 2.1 问题描述 2.2 论文模型 2.2.1 时间感知离散图结构估计&#xff08;Time-aware Discrete Graph Structure Estimation Module&#xff0c;TADG Module&#xff09; 2.2.2 时间…

【Linux】grub命令行引导进入系统

文章目录 1.grub命令行界面2.设置启动目录3.chainloader加载windows启动文件4.启动5.grub命令行无响应办法 在卸载Linux系统后&#xff0c;有的小白可能会忘记删除Linux的EFI引导。这样的话&#xff0c;下次开机时就会自动进入grub的命令行&#xff0c;连windows系统都进不去了…

C++入门学习(八)sizeof关键字

sizeof 是 C 和 C 中的一个运算符&#xff0c;用于确定特定类型或对象的内存大小&#xff08;以字节为单位&#xff09;。 1、查看数据类型占据内存大小 #include <iostream> using namespace std; int main() {short a 1;int b 1;long c 1;long long d 1;cout<…

Dubbo 的心脏:理解和应用多种协议【十三】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Dubbo 的心脏&#xff1a;理解和应用多种协议【十三】 前言<dubbo:protocol> 基础<dubbo:protocol> 的定义和作用微服务中协议的重要性支持的协议类型配置示例 配置基本配置参数高级配置选…

配置DNS主从服务器,实现真反向解析

主服务器 [rootbogon ~]# systemctl stop firewalld.service #关闭防火墙 [rootbogon ~]# setenforce 0 #关闭selinux [rootbogon ~]# systemctl restart named #启动dns服务 [rootbogon ~]# vim /etc/named.conf #进入dns配置文件 options {#监听…

2024年开年的荣誉--来自国产数据库

上周在北京参加了阿里云的开发者大会&#xff0c;我因为去年做了一点小贡献。非常荣幸的获得了阿里云的MVP的这个殊荣。&#xff08;期间也认识了一些大神级的人物&#xff09;还有就是一些网上认识的打卡们线下见面。 这个也是我一直追求的荣誉。 几乎在同时P&#xff08;Ping…

力扣hot100 找到字符串中所有字母异位词 滑动窗口 双指针 一题双解

Problem: 438. 找到字符串中所有字母异位词 文章目录 思路滑动窗口 数组滑动窗口 双指针 思路 &#x1f469;‍&#x1f3eb; 参考题解 滑动窗口 数组 ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) class Solution { // 滑动窗口 …