c语言修炼第二章--分支与循环

news2024/12/22 20:51:59

目录

前言

2.1分支语句

2.1.1什么是语句

2.2分支语句

2.2.1if语句的语法形式

2.2.2悬空else问题

2.2.3if书写形式的对比

2.3switch语句

2.3.1switch的语法形式

2.3.2 switch与break的关系

2.3.3 switch与default的关系


前言

小伙伴们端午安康吖!今天我们要开始新的一章的学习!直接开始学习叭!

2.1分支语句

2.1.1什么是语句

在了解语句之前,我们先来了解以下的知识!c语言是结构化的程序设计语言!那么什么是结构化呢又或者结构化都有哪些呢?结构化主要包括:顺序结构,循环结构,选择结构!

 选择结构对应的是分支语句(if switch语句),循环结构对应的是循环语句(while,for,do while)。言归正传,什么是语句呢?用分号隔开的就是语句。c语言的语句分类有以下五种

  • 表达式语句
  • 函数调用语句
  • 控制语句
  • 复合语句
  • 空语句

上代码来具体看看叭!

#include<stdio.h>
int main()
{
	3 + 5;//表达式语句
	printf("haha\n");//函数调用语句
	;//空语句
	return 0;
}

今天我们要讲的就是控制语句!控制语句用于控制程序的执行流程以实现程序的各种结构方式(c语言支持三种结构:顺序结构,选择结构,循环结构)它们有特定的语意符组成,c语言由九种控制语句可以分成以下三类:

  • 条件判断语句也称为分支语句:if语句,switch语句
  • 循环执行语句:while语句, for语句,do while语句
  • 转向语句:break语句 goto语句,return 语句,continue语句

2.2分支语句

2.2.1if语句的语法形式

//if的单分支语法结构
if (表达式)
   语句式;

//If的双分支的语法结构
if (表达式)
  语句式;
else
   语句式;

//if的多分支语法结构
if (表达式)
语句式;
else if (表达式)
语句式;
else if (表达式)
语句式;
else;

以年龄为例,我们具体来看看if的具体使用方式叭!当年龄小于18时我们要进行打印未成年,先用if单分支情况来试试叭

 哦豁,当输入13的时候真的打印了未成年欸,那要是当我们输入大于18时打印出成年人,可以谈恋爱该怎么办呢?再上代码叭

#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age > 18)
		printf("成年人\n");
	    printf("可以谈恋爱\n");
	return 0;
}

运行一下看看能不能达到我们的预期叭

 这里来看貌似是按照我们的预期来的!我们再输入一个值看看叭,当我们输入13时又会出现什么结果呢?

 这时竟然也打印了可以谈恋爱!可是13不是成年人呐!这时我们会发现代码出现了错误但是程序在编译时并没有出错!那么我们该怎么改呢?这里会报错是因为If后面默认控制一条语句,当出现了多条语句时要使用大括号!

#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age > 18)
	{
		printf("成年人\n");
		printf("可以谈恋爱\n");
	}
	return 0;
}

此时我们再输入13就没有问题啦(同时上面的也是复合语句的写法)

 总结一下:If语句默认控制一条语句,当出现多条语句时要使用大括号!

在用代码来看看If的双分支情况叭

#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
	{
		printf("未成年\n");
	}
	else
	{
		printf("成年人\n");
	}
	return 0;
}

这个语句也很简单,但是有一个需要注意的点:else后面不可以直接跟语句!

#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
	{
		printf("未成年\n");
	}
	else(age >= 20)//代码在编译期间会报错
	{
		printf("青年人\n");
	}
	return 0;
}

else后面想要跟语句的话得再加一个if,此时就要用到多分支啦,上代码

#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
		printf("未成年人\n");
	else if (age >= 18 && age < 30)
	{
		printf("青年\n");
	}
	else if (age >= 30 && age < 50)
	{
		printf("壮年\n");
	}
	else if (age >= 50 && age < 100)
	{
		printf("老年人\n");
	}
	else
	{
		printf("老年人\n");
	}
	return 0;
}

以上的代码有两个需要注意的地方:

  1. else后面不可以直接跟语句,而else if可以直接跟语句(再次强调)!!
  2.  不可以采用数学的写法:50<=age<=100这种写法是错误的·,这种写法才是正确的age>=50&&age<=100

2.2.2悬空else问题

直接上代码!

#include<stdio.h>
int main()
{
	int a = 5;
	int b = 3;
	if (a == 1)
		if (b == 3)
			printf("haha\n");
	else
	 printf("hehe\n");
	return 0;
}

是会打印hehe还是会打印haha1还是二者都打印亦或是二者都不打印呢?我们一起ctrl+f5来看看结果吧!

 这时我们会发现什么也没有进行打印,这是为什么呢!这是因为else只与离得最近的if进行匹配而不是离得最近的!所以我们的代码应该是这个样子的

#include<stdio.h>
int main()
{
	int a = 5;
	int b = 3;
	if (a == 1)
		if (b == 3)
			printf("haha\n");
	    else
	        printf("hehe\n");
	return 0;
}

为了更好的理解,也可以在if后面使用{ }

#include<stdio.h>
int main()
{
	int a = 5;
	int b = 3;
	if (a == 1)
	{
	  if (b == 3)
		printf("haha\n");
	  else
		printf("hehe\n");
	}
	return 0;
}

从这个代码中我们得出两点:

  1. ·else与离得最近的if进行匹配
  2. 在进行书写代码时要注意代码风格的问题。

关于代码风格的问题推荐酱酱们去看林锐博士写的《高质量c/c++编程》,里面有很好的讲述噢!

2.2.3if书写形式的对比

//第一种                              
if (condition) {
	return x;
}
return y;
//第二种
if (condition)
{
	return x;
}
else
{
	return y;
}

这俩种进行对比,酱酱们觉得哪种读起来简单明了呢?没错就是第二种!再次强调一遍一定要去看林锐博士写的《高质量c/c++编程》!

2.3switch语句

2.3.1switch的语法形式

sitch(整型表达式)
{
    语句项;
}

其中语句项由case语句组成!那么case语句的结构是什么样的,上代码!

case 整型常量表达式:
   语句;

其中值得注意的是:switch里的整型表达式决定了case的入口!

2.3.2 switch与break的关系

题目·:输入1到7可以得出相应的星期,以题目为例来熟悉switch的语法吧

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

写的很棒,再来运行一下看看结果叭

 我们输入2确实出现了我们想要的星期2,但是为什么还出现星期3到星期天呢?这就不得不要介绍switch与break的关系啦。在switch中,case决定入口,break决定出口。倘如语句中没有break,则会一直执行下去。

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

 此时就可以得到我们想要的结果啦!那要是我们想要把1到星期五都输出weekday,星期六和星期天都输出weekend!还是像之前一样写吗?不不不,我们该做一些变动

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

这样是不是简单多啦!再次进行总结:

  • 在switch中搭配break,可以实现真正的分支
  • break语句的实际效果是把语句列表划分为不同的分支部分

最后再来一个注意事项:在最后一个case语句的后面加上一条break语句,这是为了避免之前一个case语句忘了添加break语句。

2.3.3 switch与default的关系

当输入的值与所有项都不匹配,代码运行时也不进行报错,但是我们又并不想要时此时可以用上default语句。default语句的位置可以写在case语句的任意位置。default语句也要跟上一个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("weekday\n");
		break;
	case 6:
	case 7:
		printf("weekend\n");
	default:
		printf("输入错误\n");
		break;
	}
	return 0;
}

 浅浅的总结一下叭

  • 当switch表达式的值与所有的case标签的值都不匹配时,default子句后的语句就会执行
  • case与整型常量表达式之间有一个空格

以上就是今天的内容啦,端午安康酱酱们!!

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

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

相关文章

Mac菜单栏快捷开关 One Switch

One Switch是一款简单易用的 macOS 应用程序&#xff0c;它可以帮助用户快速地切换和管理 Mac 电脑的各种系统设置。这款应用程序提供了一个干净简洁的界面&#xff0c;让用户可以快速地启用或禁用诸如 Wi-Fi、蓝牙、Night Shift、暗色模式、Do Not Disturb 等功能。用户可以通…

建立无需build的vue单页面应用SPA框架

vue、react这种前端渲染的框架&#xff0c;比较适合做SPA&#xff08;Single Page Application&#xff09;。如果用ejs做SPA&#xff0c;js代码控制好全局变量冲突不算严重&#xff0c;但dom元素用jquery操作会遇到很多的名称上的冲突&#xff08;tag、id、name&#xff09;。…

运动蓝牙耳机怎么选、好用的运动蓝牙耳机推荐

在快节奏的现代生活中&#xff0c;运动成为了释放压力、保持健康和放松身心的重要方式。跑步、健身、骑行等各类运动成为了人们日常生活中不可或缺的一部分。然而&#xff0c;一场精彩的运动体验离不开动感的音乐伴奏。为了满足人们对高品质音乐的追求&#xff0c;一款出色的运…

nvm安装、管理多个node版本

1、官网下载nvm https://github.com/coreybutler/nvm-windows/releases 2、解压ZIP&#xff0c;双击nvm-setup.exe(假如以前安装了node.js&#xff0c;把以前的卸载了再安装nvm) 3、安装nvm 注意&#xff1a;这一步的nodejs目录需要手动创建 4、安装完毕&#xff0c;设置下载镜…

OpenCV动态人物识别代码

动态人物识别代码 int main() {// 打开视频文件或摄像头VideoCapture cap("vtest.avi");// VideoCapture cap(0); // 使用默认摄像头if (!cap.isOpened()){std::cout << "无法打开视频文件或摄像头流" << std::endl;return -1;}// 读取第一帧…

幽灵依赖是什么,pnpm出现的意义,使用pnpm创建一个vue3项目

什么是幽灵依赖&#xff08;幻影依赖&#xff09; 比如我们创建一个全新的vue3项目 然后我们正常地通过npm install来下载依赖 然后我们发现&#xff0c;node_ modules文件夹下的很多依赖&#xff0c;我们在package.json中明明没去声明却都下载下来了 那么这些没声明却下载…

SQL-游标-查询

/***DB版本&#xff1a;SQL Server 2022***/ --切换数据库 use MyDatabase--创建游标(scroll&#xff1a;滚动游标) declare mycur cursor scroll for select EmpNo from Employee--打开游标 open mycur --提取第一行 fetch first from mycur --提取最后一行 fetch last from m…

ansible自动化安装及简单操作

目录 一、运行机制 二、安装 1.下载ansible 2.配置免密 3.修改配置文件 4.创建主机清单 5.远程安装 6.远程卸载 一、运行机制 Ansible&#xff1a; ansible的核心模块 Host Inventory&#xff1a;主机清单&#xff0c;也就是被管理的主机列表 Playbooks&…

实战打靶集锦-021-glasgowsmile

提示&#xff1a;本文记录了博主的一次曲折的打靶经历。 目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 手工访问4.2 目录枚举4.3 手工探查4.4 搜索EXP4.5 joomlascan4.6 用户猜测与密码爆破4.7 构建反弹shell 5. 提权5.1 优化shell5.2 枚举系统信息5.3 探查/etc/pass…

虚拟机VMware+Ubuntu配置DPDK环境并运行Helloworld

虚拟机VMwareUbuntu配置DPDK环境并运行Helloworld 文章目录 虚拟机VMwareUbuntu配置DPDK环境并运行Helloworld安装虚拟机虚拟机中安装DPDK运行Helloworld 首先需要强调的是&#xff0c;版本的影响很大&#xff0c;有可能会因为版本不匹配而导致无法成功配置DPDK环境。 安装虚拟…

【Leetcode -637.二叉树的层平均值 -671.二叉树中第二小的节点】

Leetcode Leetcode -637.二叉树的层平均值Leetcode -671.二叉树中第二小的节点 Leetcode -637.二叉树的层平均值 题目&#xff1a;给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10^(- 5) 以内的答案可以被接受。 示例 1&#xff1…

TCP服务器的C#实现

1、TCP实现类 internal class TcpServer{public Socket ServerSocket { get; set; }public Dictionary<string,Socket> Sockets { get; set; } new Dictionary<string,Socket>();public byte[] SendBuffer { get; set; }public byte[] ReceiveBuffer { get; set; …

Qt消息对话框

一、头文件及类型 #include<QMessageBox> 二、错误、信息、提示、警告演示 错误对话框 QMessageBox::critical(this,"critical","错误"); 信息对话框 QMessageBox::information(this,"info","信息"); 提问对话框 if(QMessageBo…

发布自己的第一个抖音小程序

结构与微信小程序一样 内嵌H5网页&#xff0c;适用于任何平台&#xff0c;同样也是使用web-view组件 <web-view src"https://some-domain/some/path"></web-view> 相比起来&#xff0c;它比微信小程序更加简化&#xff0c;开发会更方便了。 API查询地…

超越Java 7,迎接Java 8时代!掌握这些新特性提升你的编程技能!

大家好&#xff0c;我是小米&#xff0c;一个热衷于技术分享的小伙伴。今天&#xff0c;我将向大家介绍Java 8中的一些新特性。Java 8作为一次重大更新&#xff0c;引入了许多令人激动的新功能&#xff0c;让我们的编码变得更加简洁高效。接下来&#xff0c;我们将详细介绍这些…

【暂时解决】radio单选框的change事件执行两次

项目场景&#xff1a; 简单的单选框场景 选择国内地区&#xff0c;省市县的下拉框就显示&#xff0c;选择国外地区就隐藏。 问题描述 当我使用radio的change事件时&#xff0c;会执行两次 javascript&#xff1a; $(input[typeradio][nameoptionsRadios]).change(function …

黑产科普丨揭秘游戏黑灰产业链

自今年起&#xff0c;游戏版号已恢复常态化发放&#xff0c;游戏行业在官方发文肯定、重获资本青睐、AI降本增效等多方助力下持续回暖。暑期档将至&#xff0c;游戏厂商为了抢占更多的市场份额&#xff0c;占据更多的玩家视野&#xff0c;将有大量的游戏选择在这个时间上线。 …

datax-Oracle新增writeMode支持

1.在com.alibaba.datax.plugin.writer.oraclewriter.OracleWriter中注释此内容,以让oracle支持writeMode模式 2.在com.alibaba.datax.plugin.rdbms.writer.util.WriterUtil中,增加对oracle的判断,将getWriteTemplate修改为如下内容 public static String getWriteTemplate(List…

在文件夹中获取某个文件的绝对路径

#!/bin/bash -lpathfind $(pwd) -name *.ipaecho ${path}写成下面这样也是可以的 path$(find $(pwd) -name *.ipa)如图所示&#xff0c;Export 文件夹下有.ipa文件&#xff0c;我们目前想获取.ipa文件的绝对路径 执行结果如下 192:Jenkins liubo$ cd /Users/liubo/Desktop/…

C# 通过委托实现多个窗口之间的传值

之前用qt写的时候&#xff0c;都有信号和槽来实现&#xff0c;用C#的话应该也有类似的 大概实现的是我在父窗口当中new了两个子窗口&#xff0c;这个两个子窗口都可以将处理完的数据传递给父窗口&#xff0c;并且两个子窗口通过父窗口进行通信。 我这就按上面窗口名称来说明代…