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

【C语言】分支与循环(上)

前言:C语言是由顺序结构、选择结构、循环结构组成的结构化的程序设计语言。 那C语言是如何设计和实现这些结构的呢?话不多说,马上开始。

三种结构如图所示:

我们可以使用 if else语句、 switch语句 来实现选择(分支)结构,使用for 、 while 、 do while 来实现循环结构。

ps:本篇将先总结分支结构的知识,循环结构留到(下)篇。

看完觉得有帮助的话记得点赞收藏加关注哦~

目录

一、关系、条件、逻辑操作符

 二、if else 语句

三、switch语句

四、分支结构小练习:判断闰年


首先补充分支与循环必备操作符

一、关系、条件、逻辑操作符

(1)关系操作符:

C语⾔⽤于⽐较的表达式,称为“关系表达式”,⾥⾯使⽤的运算符就称为“关系运算符”,主要有下⾯6个。

>:⼤于运算符
<:⼩于运算符
>=: ⼤于等于运算符
<=:⼩于等于运算符
==: 相等运算符
!=: 不相等运算符

用法:用于比较两个值的大小或相等性,结果通常返回0或1,表示真假。

  • eg:20<25是正确的,结果返回1;25<20是错误的,结果返回0。

(2)条件操作符:

条件操作符需要接受三个参数,因此又叫三目操作符。形式如下(exp是表达式expression的缩写):

 exp1 ? exp2 : exp3

用法:如果exp1为真, exp2计算,计算的结果是整个表达式的结果;如果exp1为假, exp3计算,计算的结果是整个表达式的结果。

  • eg:1<2?1:0 exp1是1<2,结果为真,计算exp2,结果是本身。因此这个表达式最终的结果就是exp2的结果1。

(3)逻辑运算符

提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。

! :逻辑取反运算符(改变单个表达式的真假)。

&& :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。

  • eg:!0为非零表示真,1&&0为假,1||0为真。

 二、if else 语句

(1)结构:

if(表达式)
    语句1;
else
    语句2;

 执行流程:

  • step1:判断if中表达式的真假。
  • step2:表达式为真➡执行if中的语句1,跳过else。
  • step3:表达式为假➡跳过if,直接执行else中的语句2。

tips:上面的结构仅适用于单语句的情况,因为if和else只能控制一条语句,当分支中包含多条语句时要用大括号{}将多条语句括起来形成代码块

if(表达式)
{
    语句1;
    语句3;
}
else
{
    语句3;
    语句4;
}

 先看一个问题:输⼊⼀个分数,>=60分就输出:及格,<=60分就输出:不及格。

下面三种写法都可以解决这个问题

int score=0;
scanf("%d",&score);//输入一个成绩

①if(score>=60)
    printf("及格");
 else
    printf("不及格");

②if(score>=60)
    printf("及格");
 if(score<=60)
    printf("不及格");

③if(score>=60)
    printf("及格");
 else if(score<=60)//嵌套if
    printf("不及格");

(2)嵌套if(else if)

在 if else 语句中, else 可以与另⼀个 if 语句连⽤,构成多重判断

#include <stdio.h>
int main()
{
    int num = 0;
    scanf("%d", &num);

    if(num > 0)
        printf("输⼊的数字是正数\n");
    else if(num < 0)                     
        printf("输⼊的数字是负数\n");//这⾥的if 相当于嵌套在else语句中,形成了嵌套结构
    else
        printf("输⼊的数字是0\n");

    return 0;
}

(3)悬空else问题

先看这样一段代码:

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;

    if(a == 1)
        if(b == 2)
            printf("11\n");
    else
        printf("22\n");

    return 0;
}

大家觉得结果输出什么呢? 

小飞在初学阶段看到这段代码时本能的以为结果应该打印11,但实际上什么也不输出。

为什么会这样呢?这就是悬空else问题。分析如下:

在编写代码时,如果遇到多个if和else语句。需要注意一个规则:else总是与最接近的if匹配。有时候,代码的排版可能会让人产生误解,比如上面的else与第一个if对齐,从而误以为当第一个if条件不成立时,会执行else子句。但实际上,else是和第二个最近的if语句匹配,形成嵌套的if else语句。如果第一个if条件不成立,那么嵌套的if和else语句根本就没有机会执行,因此最终可能什么都不会打印。

为了让代码更容易理解,我们应该调整代码块(添加大括号),使else与其真正匹配的if语句关系更加清晰。

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;

    if(a == 1)
    {
        if(b == 2)
            printf("11\n");
    }
    else
    {
        printf("22\n");
    }

    return 0;
}

带上适当的⼤括号形成代码块,代码的逻辑就会更加的清晰,所以以后在写代码的时候要注意括号的使⽤,让代码的可读性更⾼。


三、switch语句

除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。switch语句可以看作是⼀种特殊形式的if else语句,⽤于判断条件有多个结果的情况。它把多重的 else if 改成更易⽤、可读性更好的形式。

(1)结构:

switch (表达式) 
{
    case value1:
        语句1;
    case value2: 
        语句2;
    default: 
        语句3;
}

上⾯结构中,根据表达式不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,就执⾏ default 分⽀。
注意:

  • switch 后的(表达式)必须是整型表达式(可以是数值,也可以是表达式,如a+b,a,b均是变量)。
  • case 后的value值,必须是整形常量表达式(只能是数值,如1、2)。
  • case 和后边的数字之间必须有空格

(2)break和default

①break

每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句

eg:

写一个输入⼀个1~7的数字,打印对应的星期⼏的程序:

#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;
}

当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。 

比如当判断星期几是工作日还是休息日时,我们可以只在星期五和星期日时写break,这样在遇到星期1~5时因为没有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;
}

②default

在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,⽐如 switch 后的表达式中的值⽆法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊default ⼦句。switch 后边的表达式结果不是 value1 ,也不是 value2 的时候,就会执⾏default ⼦句
就⽐如上面打印星期的练习,如果 day 的输⼊不是1~7的值,如果我们要提⽰:输⼊错误,即可:

switch(day)
    {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        printf("⼯作⽇\n");
        break;
    case 6:
    case 7:
        printf("休息⽇\n");
        break;
    default://输入无匹配
        printf("输⼊错误\n");
        break;
    }

tips:switch语句中的case和default无顺序要求,只要顺序是满⾜实际需求的就可以。不过习惯把 default ⼦句放在最后处理。


四、分支结构小练习:判断闰年

输⼊⼀个年份year,判断year是否是闰年?

闰年判断的规则:
能被4整除并且不能被100整除是闰年,即满足year%4==0 && year%100!=0
能被400整除是闰年,即满足year%400==0

参考代码:

#include <stdio.h>
int main()
{
    int year = 0;
    scanf("%d", &year);

    if(year%4==0 && year%100!=0)
        printf("是闰年\n");
    else if(year%400==0)
        printf("是闰年\n");

    return 0;
}

 结语:非常感谢耐心看到这里的小伙伴,本文主要讲了分支与循环中的分支结构,它们是代码中的重要组成成分,是构建任何复杂结构的基石。下期主要围绕循环结构展开。本篇文章到此结束,我们下期再见!

如果上述内容对您有帮助的话,还请点赞收藏✿

如果发现内容有误,还请给予指正,十分感谢:>

相关文章:

  • linux打包前端vue,后端springboot项目
  • CentOS 7 挂载与卸载文件系统笔记
  • 物联网中的物模型是什么意思,在嵌入式软件开发中如何体现?
  • 树——构造和遍历问题——面试专题
  • 屏幕后处理Post-Processing安装及使用
  • 如何学习并使用C++
  • Linux中的信号
  • Table ‘spzx-system.QRTZ_LOCKS‘ doesn‘t exist
  • 安全+低碳+高效:Acrel-3000助力企业打造未来型电能管理体系-安科瑞黄安南
  • 国内AI与国际AI的差距分析
  • 介绍FRAMES:一个统一的检索增强生成评估框架
  • Python入门学习笔记 - 从环境搭建到基础语法
  • 【Java SE】包装类 Byte、Short、Integer、Long、Character、Float、Double、Boolean
  • JDBC删除与查询
  • PLC协议
  • 动态代理模式实现与对比(JDK、CGLIB、Spring AOP)
  • vue数据两个相同的参数对比只显示一个
  • HarmonyOS主题管理工具封装:动态切换、持久化存储与常见问题解析
  • sourcetree中的“master“,“origin/master“,“origin/HEAD“这三个图标都是什么意思?GIT 超详细➕通俗易懂版本
  • Unity中对象池(Object Pool)技术解析与实现
  • 媒体谈法院就“行人相撞案”道歉:执法公正,普法莫拉开“距离”
  • 黄土是他们的气质:打破宁夏当代油画创作的沉寂
  • 上海“量子城市”先导应用场景落地曹杨社区,提供哪些服务?
  • 中山大学人类学系原系主任冯家骏逝世,享年95岁
  • 让“五颜六色”面孔讲述上海故事,2025年上海城市推荐官开启选拔
  • 广西钦州:坚决拥护自治区党委对钟恒钦进行审查调查的决定