[C语言]分支语句和循环语句

news2024/11/16 11:47:47

[C语言]分支语句和循环语句

文章目录

  • [C语言]分支语句和循环语句
    • C语言语句分类
    • 分支语句
      • if语法结构
      • else的匹配规则
      • switch语句
      • switch语句中的break
      • switch语句中default
    • 循环语句
      • while循环
      • while循环中的break和continue
      • for循环
      • for循环中的break和continue
      • for循环的变种
      • do while循环
      • do while循环中的break和continue
    • goto语句

C语言语句分类

C语言的语句可分为以下五类:

  1. 表达式语句
  2. 函数调用语句
  3. 控制语句
  4. 复合语句
  5. 空语句

其中,控制语句用于控制程序的执行流程,以实现程序的各种结构方式,C语言有九种控制语句。 可分成以下三类:

  1. 条件判断语句也叫分支语句:if语句、switch语句;
  2. 循环执行语句:do while语句、while语句、for语句;
  3. 转向语句:break语句、goto语句、continue语句、return语句。

C语言是结构化的程序设计语言,包含如下结构:

  • 顺序结构 – 按照代码既定顺序执行
  • 选择结构 – 选择一部分代码执行
  • 循环结构 – 重复执行同一段代码

image-20230820102122014

C语言通过分支语句来形成选择结构,通过循环语句来形成循环结构。无论是分支语句还是循环语句都属于控制语句

分支语句

if语法结构

if语句有以下三种语法结构:

  1. 单分支
语法结构:
if(表达式)
    语句;
  • 表达式为真,执行语句。
#include <stdio.h>

int main()
{
	int age = 16;
	if (age < 18) //表达式为真,输出未成年
		printf("未成年\n");
	return 0;
}
  1. 双分支
if(表达式)
    语句1;
else
    语句2;
  • 表达式为真,执行语句1。
  • 表达式为假,执行语句2。
#include <stdio.h>

int main()
{
	int age = 20;
	if (age < 18) //表达式为假,输出成年
		printf("未成年\n"); 
	else
		printf("成年\n");
	return 0;
}
  1. 多分支
if(表达式1)
    语句1;
else if(表达式2)
    语句2;
else
    语句3;
  • 表达式1为真,则执行语句1。
  • 表达式2为真,执行语句2。
  • else前的所有表达式都为假,执行语句3。
  • 可以使用多个else if来控制多个分支。
#include <stdio.h>

int main()
{
	int age = 59;
	if (age < 18)
		printf("未成年\n");
	else if (age >= 18 && age < 60) //该表达式为真,输出成年
		printf("成年\n");
	else
		printf("老年\n");
	return 0;
}

补充:

  • C语言中0表示假,1表示真。
  • if语法结构中无论有多少分支,最终只能选择其中一个分支执行。
  • if、else if、else只能控制后续的一条语句,如果要控制多条语句需要用{}将语句变成代码块。

代码块中可以有多条语句,使用代码块的结构如下:

#include <stdio.h>
int main()
{
    if(表达式)
   {
        语句列表1}
    else
   {
        语句列表2}
    return 0;
}

else的匹配规则

else是和它离的最近的if匹配的。

#include <stdio.h>

int main()
{
    int a = 0;
    int b = 2;
    if (a == 1)
        if (b == 2)
            printf("hehe\n");
    else
        printf("haha\n");
    return 0; //没有输出
}

由于else匹配的是最近的if,else是和if (b == 2)语句匹配的,因此当if (a == 1)中条件不成立时,打印语句就都不会被执行。为了提高代码的可读性,建议修改成如下写法:

#include <stdio.h>

int main()
{
    int a = 0;
    int b = 2;
    if (a == 1)
    {
        if (b == 2)
            printf("hehe\n");
        else
            printf("haha\n");
    }
    return 0;
}

以上两段代码的功能是相同的,但是由于书写方式不同,可读性就有所不同。

switch语句

switch语句也是一种分支语句,常常用于多分支的情况。

switch语句的主要语法结构如下:

switch(整型表达式)
{
    case 整形常量表达式:
    语句;
    //...
}
  • switch中必须使用整形表达式作为判断对象。
  • case中必须使用整形常量表达式作为判断条件。
  • switch中的整形表达式和case整形常量表达式进行对比判断,进行选择进入到对应的case情况中。
#include <stdio.h>

int main()
{
	int day = 0;
	scanf("%d", &day); //输入为4
	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;//输出为星期四 星期五 星期六 星期天
}

虽然在上面这段代码中day选择了case 4,但是由于该情况中没有控制结束,因此switch语句会顺序执行,将case 5、case 6、case 7也执行。

switch语句中的break

在switch语句中的 break可以把语句列表划分为不同的分支部分。

#include <stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);//输入为4
	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;//输出为星期四
}

在执行完case 4中的语句后,break控制了该情况结束,跳出并且结束switch语句。

switch语句中default

default表示除以上case情况外的所有情况。

#include <stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day); //输入8
	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;
	default:
		printf("输入错误\n");
		break;
	}
	return 0; //输出为输入错误
}

循环语句

while循环

while循环的语法结构:

while(表达式)
	循环语句;
  • 循环判断表达式,表达式为真,执行循环语句。
  • 表达式为假,结束循环。
  • 循环语句为多条语句时,需要使用{}将其变成代码块。
#include <stdio.h>

int main()
{
	int i = 0;
	while (i < 5)
	{
		printf("%d ", i);
		i++;
	}
	return 0; //输出 0 1 2 3 4
}

while循环中的break和continue

while中的break是用于永久终止循环的。在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。

#include <stdio.h>

int main()
{
	int i = 0;
	while (i < 5)
	{
		if (i == 3)
			break;
		printf("%d ", i);
		i++;
	}
	return 0; //输出为 0 1 2
}

当i=3时,while表达式判断为真执行循环语句,if表达式判断为真,执行break语句终止了while循环。

continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

#include <stdio.h>

int main()
{
	int i = 0;
	while (i < 5)
	{
		i++;
		if (i == 3)
			continue;
		printf("%d ", i);
	}
	return 0; //输出为 1 2 4 5
}

当i=3时,while表达式判断为真执行循环语句,if表达式判断为真,执行continue语句终止了本次循环,进入了下一次循环。

while循环的大致流程图:

image-20230820133359713

for循环

for循环的语法结构:

for(表达式1; 表达式2; 表达式3)
 循环语句;
  • 表达式1为初始化部分,用于初始化循环变量的。
  • 表达式2为条件判断部分,用于判断循环时候终止。
  • 表达式3为调整部分,用于循环条件的调整。
  • 循环语句为多条语句时,需要使用{}将其变成代码块。
#include <stdio.h>

int main()
{
	int i = 0;
	for (i = 1; i < 10; i++)
	{
		printf("%d ", i);
	}
	return 0; //输出为 1 2 3 4 5 6 7 8 9
}

for循环中的break和continue

在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。

#include <stdio.h>

int main()
{
	int i = 0;
	for (i = 1; i < 5; i++)
	{
		if (i == 3)
			break;
		printf("%d ", i);
	}
	return 0; //输出为 1 2
}

当i=3时,for表达式判断为真执行循环语句,if表达式判断为真,执行break语句终止了for循环。

#include <stdio.h>

int main()
{
	int i = 0;
	for (i = 1; i < 5; i++)
	{
		if (i == 3)
			continue;
		printf("%d ", i);
	}
	return 0; //输出为 1 2 4
}

当i=3时,for表达式判断为真执行循环语句,if表达式判断为真,执行continue语句终止了本次循环,进入了下一次循环。

for循环的大致流程图:

image-20230820140402568

for循环的变种

#include <stdio.h>

int main()
{
	for (;;)
	{
		printf("hehe\n");
	}
	return 0; //死循环输出 hehe
}

for循环中的初始化部分,判断部分,调整部分都是可以省略的,全部都省略相当于循环条件永远为真。

#include <stdio.h>

int main()
{
    int i = 0;
    int j = 0;
    for (i = 0; i < 10; i++)
    {
        for (j = 0; j < 10; j++)
        {
            printf("hehe\n");
        }
    }
    return 0; //输出为100个hehe
}

for循环进行了嵌套,外层循环循环10次,外层循环每次都执行一次内层循环,一次内层循环执行10次,因此一共是100次。

#include <stdio.h>

int main()
{
    int i = 0;
    int j = 0;
    for (; i < 10; i++)
    {
        for (; j < 10; j++)
        {
            printf("hehe\n");
        }
    }
    return 0; //输出为10个hehe
}

for循环进行了嵌套,外层循环循环10次,外层循环每次都执行一次内层循环,第一次内层循环执行10次后,j为10,下一层内层循环没有初始化,j依旧为10,内层循环无法再执行,因此一共是10次。

#include <stdio.h>

int main()
{
    int x, y;
    for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
    {
        printf("hehe\n");
    }
    return 0; //输出为2个hehe
}

循环的判断条件是x < 2 && y < 5,循环两次后x<2不再满足,因此只能执行两次。

#include <stdio.h>

int main()
{
    int i = 0;
    int k = 0;
    for (i = 0, k = 0; k = 0; i++, k++)
        k++;
    return 0;
}

判断条件是k=0,是一个赋值语句,赋值语句的结果为所赋的值,因此该语句的结果为0,循环一次都不执行。

do while循环

do while循环的语法结构:

do
 循环语句;
while(表达式);
  • 先执行一次循环语句在判断表达式,因此循环至少执行一次。
  • 循环语句为多条语句时,需要使用{}将其变成代码块。
#include <stdio.h>

int main()
{
	int i = 1;
	do
	{
		printf("%d ", i);
		i++;
	} while (i <= 5);
	return 0; //输出 1 2 3 4 5
}

do while循环中的break和continue

#include <stdio.h>
int main()
{
	int i = 1;
	do
	{
		if (3 == i)
			break;
		printf("%d ", i);
		i = i + 1;
	} while (i <= 5);
	return 0; //输出 1 2 
}

i=3时,if表达式判断为真,执行break语句终止了循环。

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

i=3时,if表达式判断为真,结束本次循环进行下一次循环。

do while循环的大致流程图:

image-20230820171738939

总结:

  • 无论何种循环语句,break的作用都是结束循环。
  • 无论何种循环语句,continue的作用都是不执行continue后的代码,跳转到循环判断。(for循环会在跳转到循环判断前进行循环条件的调整)

goto语句

C语言中goto语句可以向标志位置进行程序跳转。

#include <stdio.h>

int main()
{
	printf("hello world\n");
	goto flag;
	printf("hello goto\n");
flag:
	printf("hello blog\n");
	return 0; //输出为 hello world hello blog
}

其中flag:作为标志位供goto语句进行跳转,由于goto语句跳转到了标志位置,会导致中间的代码不被执行。

  • 标志名任意,只需要使用标志名:标志位置即可使用goto语句跳转。
  • goto语句由于会导致代码的可读性和可维护性降低等原因,因此不常被使用。
  • goto语句适用于从多层循环的内部向外跳转。

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

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

相关文章

ARM汇编【1】:数据类型

与高级语言类似&#xff0c;ARM支持对不同数据类型的操作。我们可以加载或存储的数据类型可以是有符号和无符号字、半字或字节。这些数据类型的扩展名是&#xff1a;-h或-sh表示半字&#xff0c;-b或-sb表示字节&#xff0c;不表示字的扩展名。有符号数据类型或无符号数据类型之…

二重积分小技巧---交换积分

又一个奇技淫巧。 【例1】 ∫ 0 1 d y ∫ y 1 x 3 1 d x ? \int _0 ^1 dy \int _{\sqrt y} ^ 1 \sqrt{x^3 1} dx ? ∫01​dy∫y ​1​x31 ​dx? 解析&#xff1a; 不说话&#xff0c;看下图&#xff1a; ∫ 0 1 d y ∫ y 1 x 3 1 d x ∫ 0 1 d x ∫ 0 x 2 x 3 1 d…

照亮虚拟网络流量“盲区”:超融合网络流量可视化功能解读

云计算时代下&#xff0c;网络虚拟化使网络管理更加集中、灵活和便捷&#xff0c;但同时也让云内的网络变得更加复杂。传统网络流量诊断方法和工具&#xff0c;难以对云内虚拟网络的“东-西向流量”进行可视化呈现和分析&#xff0c;形成了网络运维管理的盲区&#xff0c;提升了…

Shopify独立站也会被封店?告诉你这背后深藏的玄机!

很多人觉得做独立站就完全自由了&#xff0c;不被平台监管&#xff0c;也不会被封店。但事实真的是这样吗&#xff1f;其实独立站只是相对自由&#xff0c;受到的监管相对较少&#xff0c;封店的风险较小&#xff0c;但并不是完全高枕无忧。想知道什么情况下会被封店&#xff1…

无涯教程-PHP - 全局变量函数

全局变量 与局部变量相反,可以在程序的任何部分访问全局变量。通过将关键字 GLOBAL 放置在应被识别为全局变量的前面,可以很方便地实现这一目标。 <?php$somevar15;function addit() {GLOBAL $somevar;$somevar;print "Somevar is $somevar";}addit(); ?> …

MyBatis快速入门以及环境搭建和CRUD的实现

目录 前言 一、MyBatis简介 1.MyBatis是什么 2.MyBatis的特点 3.mybatis的作用 4.MyBatis的应用场景 5.MyBatis优缺点 二、相关概念 1.ORM概述 2.常见的ORM框架 3.什么是持久层框架 三、MyBatis的工作原理 1.框架交互 2.工作原理 ​编辑 四、MyBatis环境搭建 1…

SQL - 开窗(窗口)函数

什么是开窗函数&#xff1f; 开窗函数对一组值进行操作&#xff0c;它不像普通聚合函数那样需要使用GROUP BY子句对数据进行分组&#xff0c;能够在同一行中同时返回基础行的列和聚合列 开窗函数的语法形式为&#xff1a;函数 over(partition by <分组用列> order by …

Vue2到3 Day7 全套学习内容,众多案例上手(内付源码)

简介&#xff1a; Vue2到3 Day1-3 全套学习内容&#xff0c;众多案例上手&#xff08;内付源码&#xff09;_星辰大海1412的博客-CSDN博客本文是一篇入门级的Vue.js介绍文章&#xff0c;旨在帮助读者了解Vue.js框架的基本概念和核心功能。Vue.js是一款流行的JavaScript前端框架…

【C语言】三子棋游戏——超细教学

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将结合之前的知识来实现 三子棋游戏。 目录&#xff1a; &#x1f31f;思路框架&#xff1a;测试游戏 &#x1f31f…

LangChain + Streamlit + Llama:将对话式AI引入本地机器

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 什么是LLMS&#xff1f; 大型语言模型 &#xff08;LLM&#xff09; 是指能够生成与人类语言非常相似的文本并以自然方式理解提示的机器学习模型。这些模型使用包括书籍、文章、网站和其他来源在内的…

PCIE 信息

PCIe&#xff08;外围组件互连快件&#xff09;是用于连接高速组件的接口标准。每台台式电脑主板有许多 PCIe 插槽&#xff0c;可用于添加通用显卡&#xff0c;各种外设卡&#xff0c;无线网卡或固态硬盘等等。PC 中可用的 PCIe 插槽类型将取决于你购买的主板. PCIe 插槽有不同…

无需公网IP——搭建web站点

文章目录 概述使用 Raspberry Pi Imager 安装 Raspberry Pi OS设置 Apache Web 服务器测试 web 站点安装静态样例站点将web站点发布到公网安装 Cpolar内网穿透cpolar进行token认证生成cpolar随机域名网址生成cpolar二级子域名将参数保存到cpolar配置文件中测试修改后配置文件配…

9.4 多线程之线程池

线程池 进程已经能做到并发编程了 , 为什么还需要线程 ? 进程实在是太重量了 , 创建和销毁成本都比较高 , 需要申请释放资源 线程就是针对上述问题的优化 , 因为他是共用同一组系统资源的 , 一旦资源申请好了 , 后续就不需要再继续申请了 虽然线程已经很好了 , 不过在更高频…

浙大全日制英文MBA项目提面申请截至9月3日:几乎是上岸必经之路

今年浙大全日制MBA项目提前批面试做了改革&#xff0c;一年只设定一个批次申请&#xff0c;对于考生们来说其实是不太有利的&#xff0c;原因在于整个提面时间节奏会将部分考生逼到进退两难的境地&#xff0c;一方面无提面的状态下全日制MBA项目都知道需要比较高的分数才可能够…

计算机竞赛 基于CNN实现谣言检测 - python 深度学习 机器学习

文章目录 1 前言1.1 背景 2 数据集3 实现过程4 CNN网络实现5 模型训练部分6 模型评估7 预测结果8 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于CNN实现谣言检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&am…

GC的前置工作,聊聊GC是如何快速枚举根节点的

本文已收录至GitHub&#xff0c;推荐阅读 &#x1f449; Java随想录 原创不易&#xff0c;注重版权。转载请注明原作者和原文链接 文章目录 什么是根节点枚举根节点枚举存在的问题如何解决根节点枚举的问题安全点安全区域 上篇文章中我们留下了个坑&#xff1a;「 根节点枚举」…

计网第三章(数据链路层)(四)

目录 一、MAC地址和IP地址以及ARP协议 1.MAC地址&#xff1a; 单播MAC地址&#xff1a; 广播MAC地址&#xff1a; 多播MAC地址&#xff1a; 2.IP地址&#xff1a; 3.IP地址和MAC地址&#xff1a; 1.什么情况下使用&#xff1f; 2.IP地址和MAC地址填写位置&#xff1f;…

保障用户观影体验 极米推出首款搭载超级混光技术投影仪极米RS Pro 3

随着投影市场的日渐蓬勃&#xff0c;倒推了投影技术的研发创新&#xff0c;投影仪产品在最近几年已经逐步进入到家庭空间&#xff0c;成为很多家庭不可或缺的家电产品&#xff0c;不论是客厅还是卧室&#xff0c;或者是户外露营等&#xff0c;投影仪的家用场景已经拓展到了人们…

ps2024后期调色滤镜插件使用教程图解

Exposure是一款常见的ps调色滤镜插件&#xff0c;相信许多朋友都曾经用过它。一个优秀的摄像师不仅需要懂得摄像技巧&#xff0c;还要掌握图像的后期调色窍门。那么&#xff0c;后期调色软件哪个好&#xff0c;后期调色教程图解&#xff0c;接下来一起来了解一下吧。 一、后期…

为何Ping不通啊?

为什么Ping不通啊&#xff01;求指点&#xff1f; 友情提醒&#xff0c;这个问题难度系数初级难度&#xff08;CCNA&#xff09;&#xff0c;只适合初级读者阅读&#xff0c;避免浪费宝贵时间。 Q1: 为何PC1能Ping通PC2&#xff1f;或反之亦然&#xff1f; PC1主观认为PC2和自…