初始C语言-分支与循环语句

news2025/1/19 20:25:45

目录

一、语句

1. 什么是语句?

C语句可分为以下五类:

1. 表达式语句

2. 函数调用语句

3. 控制语句

4. 复合语句

5. 空语句

2. 控制语句:

1. 条件判断语句也叫分支语句:if语句、switch语句;

2. 循环执行语句:do while语句、while语句、for语句;

3. 转向语句:break语句、goto语句、continue语句、return语句。

二、分支语句

1.if语句

1.1例子: 

 1.2悬空else

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

2.switch语句

2.1 在switch语句中的 break

2.2 default子句

 三、循环语句

1.while语句

1.1while语句中的break与continue

1.2总结:

2.for循环

2.1同样的例子:

2.2 break和continue在for循环中

2.3 for语句的循环控制变量

2.4 一些for循环的变种

 2.5大坑题

3. do...while()循环 


一、语句

1. 什么是语句?

C语句可分为以下五类:

1. 表达式语句

2. 函数调用语句

3. 控制语句

4. 复合语句

5. 空语句

本章后面介绍的是控制语句。

2. 控制语句:

用于控制程序的执行流程,以实现程序的各种结构方式( C语言支持三种结构:顺序结构、选 择结构、循环结构 ),它们由特定的语句定义符组成,C 语言有九种控制语句。
可分成以下三类:

1. 条件判断语句也叫分支语句:if语句、switch语句;

2. 循环执行语句:do while语句、while语句、for语句;

3. 转向语句:break语句、goto语句、continue语句、return语句。

二、分支语句

1.if语句

语法结构:

1)单分支if

                if ( 表达式 )
                    语句 ;
2)if else语句(双分支)
                if ( 表达式 )
                    语句1 ;
                else
                    语句2 ;
3)if elseif else(多分支)    
                if ( 表达式 1 )
                    语句1 ;
                else if ( 表达式 2 )
                    语句2 ;
                else
                    语句 3 ;
注意:
如果表达式的结果为真,则语句执行。在C语言中如何表示真假?
0表示假,非0表示真。

如果条件成立,要执行多条语句,怎应该使用代码块。
这里的一对 { } 就是一个代码块。

 

1.1例子: 

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

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

//代码3
#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)
   {

 1.2悬空else

有时会遇到这种代码,由于省略了{},或者没有对齐代码(缩进格式问题),导致对代码理解产生误解。

//适当的使用{}可以使代码的逻辑更加清楚。
//代码风格很重要

例子:

这个else到底与哪个if是匹配的?代码最终是什么结果?其实是第二个if,结果是什么也没输出。原因很简单:

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

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
        if(b == 2)
            printf("hehe\n");
    else//与上面最近的if进行匹配
        printf("haha\n");
    return 0;
}

其实上面的代码就等于这样

当a=0时,第一个if语句判断a==1表达式为假,不执行该语句。压根就没进去这个代码块,于是直接跳到return 0;结束该程序了。

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
    {
        if(b == 2)
        {
            printf("hehe\n");
        }
        else//与上面最近的if进行匹配
        {
            printf("haha\n");
        }
    }
        
    return 0;
}

 

修改代码:

而我们真正想要的是这样

a==1的时候如果b==2打印hehe,否则a为其他值,打印haha

修改代码后,逻辑明显清晰了许多,所以养成良好的代码习惯很重要

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

 

2.switch语句

switch 语句也是一种分支语句。
常常用于多分支的情况。
比如:
输入 1 ,输出星期一
输入 2 ,输出星期二
输入 3 ,输出星期三
输入 4 ,输出星期四
输入 5 ,输出星期五
输入 6 ,输出星期六
输入 7 ,输出星期日
那我没写成 if...else if ...else if 的形式太复杂,那我们就得有不一样的语法形式。
这就是 switch 语句。
switch ( 整型表达式 )
{
  //  语句项;
case 整形常量表达式 :
    语句 ;
}

2.1 switch语句中的 break

switch 语句中,我们没办法直接实现分支,搭配 break 使用才能实现真正的分支。
        每个case里的语句,需要适当的break,因为在switch语句里,是从上到下依次执行的,没有break代表着会一直往下执行,直至执行完最后一条switch里的语句。
例子1:
#include <stdio.h>
int main()
{
    int day = 1;
    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将得到这样的结果:所有语句执行了,全输出来了

 

例2:

有时候我们的需求变了:
1. 输入 1-5 ,输出的是 “weekday”;
2. 输入 6-7 ,输出 “weekend”
所以我们的代码就应该这样实现了:
#include <stdio.h>
int main()
{
    int day = 3;
    switch(day)
   {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            printf("weekday\n");
            break;
        case 6:
        case 7:
            printf("weekend\n");
            break;
   }
    return 0;
}

 

编程好习惯
在最后一个 case 语句的后面加上一条 break 语句。
(之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break 语句)。

2.2 default子句

如果表达的值与所有的case标签的值都不匹配,default来与该匹配
例子: 当不匹配时,默认走了default语句
int main()
{
	int n = 0;
	scanf("%d", &n);

	switch (n)
	{
	case 1:
	case 2:
	case 3:
		printf("3以内\n");
		break;
	default:
		printf("非3以内的数\n");
		break;
	}

	return 0;
}

 

编程好习惯
在每个 switch 语句中都放一条 default 子句是个好习惯,甚至可以在后边再加一个 break

 

 三、循环语句

做一些重复往返的工作时,用循环语句

1.while语句

例如:在屏幕上打印 1-10 的数字。
#include <stdio.h>
int main()
{
 int i = 1;
 while(i<=10)//循环判断条件,当表达式为真进入循环体,否则不进入循环;当进入循环后,条件不满足时,跳出循环
 {
     printf("%d ", i);
     i = i+1;
 }
 return 0;
}

1.1while语句中的break与continue

//理解break和continue
int main()
{
	int i = 1;
	while (i <= 10) 
	{
		//if (5 == i)
		//	break;//1 2 3 4
		//break结束整个循环,永久终止循环
		if (5 == i)
			continue;//1 2 3 4 死循环
		//跳过此次循环,忽略跳过continue后面的代码,重新回到该while循环判断表达式,是否进入下一个循环
		printf("%d ", i);
		i++;
	}
	return 0;
}
break最终结果:
永久结束整个循环

 continue最终结果:

仔细观察,此时程序并没有结束,在4后死循环了

 

1.2总结:

1)break while 循环中的作用:
其实在循环中只要遇到 break ,就停止后期的所有的循环,直接终止循环。
所以: while 中的 break 是用于 永久 终止循环的。
2)continue while 循环中的作用就是:
continue 是用于终止本次循环的,也就是本次循环中 continue 后边的代码不会再执行,
而是直接跳转到 while 语句的判断部分。进行下一次循环的入口判断。

2.for循环

for ( 表达式 1 ; 表达式 2 ; 表达式 3 )
循环语句 ;
for(初始化;判断;调整)
语法
表达式 1
表达式 1 初始化部分 ,用于初始化循环变量的。
表达式 2
表达式 2 条件判断部分 ,用于判断循环时候终止。
表达式 3
表达式 3 调整部分 ,用于循环条件的调整。

2.1同样的例子:

使用 for 循环 在屏幕上打印 1-10 的数字。
#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}

2.2 breakcontinuefor循环中

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

 break最终结果:

 

continue最终结果: 

 

2.3 for语句的循环控制变量

建议:
1. 不可在 for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议 for 语句的循环控制变量的取值采用 前闭后开区间 写法。
// 前闭后开的写法
for ( i = 0 ; i < 10 ; i ++ )
{}
// 两边都是闭区间
for ( i = 0 ; i <= 9 ; i ++ )
{}

 

 

2.4 一些for循环的变种

1)for循环中的 初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。

例如这样就死循环了

//代码1
for(;;)
{
printf("hehe\n");
}

2)省略初始化带来的问题

正常情况下打印3*3也就是9和hehe

//代码2
   int i = 0;
   int j = 0;
   //这里打印多少个hehe?
   for(i=0; i<3; i++)
  {
       for(j=0; j<3; j++)
      {
          printf("hehe\n");
      }
  }

 

当省略i=0和j=0,则只打印3次hehe

 

 2.5大坑题

一次都不循环,因为k=0;这个判断条件=是赋值,而不是==判断是否相等,

所以此时表达式恒为假,不进入循环

//请问循环要循环多少次?
#include <stdio.h>
int main()
{
 int i = 0;
 int k = 0;
 for(i =0,k=0; k=0; i++,k++)
        k++;
 return 0;
}

3. do...while()循环 

循环至少执行一次,使用的场景有限,所以不是经常使用。
do
循环语句 ;
while ( 表达式 );

 例子:

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

3.1do while循环中的breakcontinue

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

 

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

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

相关文章

extern “C“的作用以及c/c++代码互调

一、目的相信从事嵌入开发的小伙伴肯定遇到过使用第三库的情景&#xff0c;有时候可能是C中调用C库&#xff0c;有时候可能又是C中调用C库&#xff1b;如果你遇到过&#xff0c;那你肯定知道extern "C"的作用.本篇的目的就是给大家介绍C/C互相调用的原理和实践。二、…

RK3588平台开发系列讲解(内核调试篇)CPU Hotplug 调试

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、CPU Hotplug 介绍二、CPU Hotplug 内核开关三、sysfs调试沉淀、分享、成长,让自己和他人都能有所收获!😄 📢多核系统底层驱动提供了cpu的Plugin/Unplug接口,可以实现动态调整cpu使用运行。 一、CPU Hotplu…

在 Node JS 中实现微服务架构

&#x1f4cd;简介&#x1f642; 正如我们在之前的博客“单体与微服务&#xff1a;一种实用方法”中讨论的那样。但是今天我们要在 NodeJS 中实现微服务架构。&#x1f449; 您可以使用任何技术&#xff0c;如 Spring、Python 等。但我们将使用 NodeJS 进行演示。&#x1f4cd;…

PostgreSQL下载、安装和配置使用

1&#xff09;下载 PostgreSQL官网下载&#xff1a;https://www.enterprisedb.com/downloads/postgres-postgresql-downloads 2&#xff09;安装 双击运行安装包 选择安装目录&#xff0c;不推荐安装在C盘。 选择需要安装的服务&#xff0c;不明白是啥的全选就行&#xf…

内含JAVA简单概括和JAVA所需安装的软件和详细教程,想学习JAVA无从下手,这篇文章带你迈出第一步

本文大致概括了JAVA编程语言的简史和特点,主要介绍了JAVA开发环境安装,涉及JDK,Sublime Text IntelliJ IDEA三个软件的简单介绍,安装和使用,最后编写了第一个JAVA代码,保姆级教学,跟着文章一步步来,迈出你学习JAVA的第一步吧! 初识JAVA一.JAVA语言简介二.JAVA发展简史三.JAVA语…

通过模拟器实现APP抓包

本教程将跳过工具安装部分&#xff0c;请正确食用&#x1f609;我的环境&#xff1a;操作系统&#xff1a;win11模拟器版本&#xff1a;雷电安卓模拟器稳定版-安卓7.1(32位) V5.0.46抓包工具&#xff1a;Wireshark-Version 4.0.1抓包工具&#xff1a;charles-Version 4.6.3工具…

SpringMVC(十一):SpringMVC文件上传中要解决的问题

文章目录 SpringMVC文件上传中要解决的问题 一、中文文件名编码问题 二、文件位置存储问题

【YOLO系列】YOLOv8算法(尖端SOTA模型)

前言回顾 在这里粗略回顾一下YOLOv5&#xff0c;这里直接提供YOLOv5的整理的结构图吧 Backbone&#xff1a;CSPDarkNet结构&#xff0c;主要结构思想的体现在C3模块&#xff0c;这里也是梯度分流的主要思想所在的地方&#xff1b;PAN-FPN&#xff1a;双流的FPN&#xff0c;必…

Linux——常用命令1.

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;linux &#x1f525;<3>创作者&#xff1a;我的代码爱吃辣 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<5>前言&#xff1a;Linux常用命令 目录 …

Centos7安装JDK1.8(OracleJDK8)

Linux安装JDK1.8 | OracleJDK8Linux安装JDK1.8(OracleJDK8)卸载openJDK官网下载OracleJDK8解压JDK到指定目录配置JDK变量查看jdk是否可用Linux安装JDK1.8(OracleJDK8) Hadoop官方的JDK要求https://cwiki.apache.org/confluence/display/HADOOP/HadoopJavaVersions JDK变量配置…

Java——》下载Hotspot 虚拟机源码

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Java——》下载Hotspot 虚拟机源码一、官网下载压…

信息系统基础

目录 一、信息化概述 1.信息的定义 2.信息的特点 3.信息化的概念 4.信息对经济社会的意义 5.信息化对组织的意义 二、信息系统工程的总体规划 1.信息系统工程总体规划方法论 2.信息系统的生命周期和各阶段的目标 三.政府信息化与电子政务 1.电子政务的组成 2.电子政务…

mysql的binlog学习记录

文章目录什么是binlogbinlog格式StatementRowMixedbinlog使用什么是binlog MySQL Binary Log也就是常说的bin-log, ,是mysql执行改动产生的二进制日志文件。简单的来说&#xff0c;binlog日志用于记录所有更新了数据或者以及潜在更新了数据&#xff08;例如&#xff0c;没有匹…

在线学习(online learning)——Chapter 1 What is online learning

在线学习(online learning)——Chapter 1 What is online learning 引用 [1]Hoi S C H, Sahoo D, Lu J, et al. Online learning: A comprehensive survey[J]. Neurocomputing, 2021, 459: 249-289.点击阅读 [2]Orabona F. A modern introduction to online learning[J]. ar…

【1分钟了解网络交换机的6种命令配置模式】

我们在配置交换机的时候首先要了解的就是交换机命令模式&#xff0c;小编用Cisco思科交换机为例带大家了解交换机的6种配置模式。 Cisco IOS提供了用户EXEC模式和特权EXEC模式两种基本的命令执行级别&#xff0c;同时还提供了全局配置、接口配置、Line配置和vlan数据库配置等多…

linux篇【13】:网络应用层—网络版计算器,序列化

目录 一.应用层 1.再谈 "协议" 2.序列化&#xff0c;反序列化 &#xff08;1&#xff09;序列化&#xff0c;反序列化的实例&#xff1a; &#xff08;2&#xff09;自描述长度的协议 3.网络版计算器 细节&#xff08;1&#xff09;&#xff1a;报头方案 &am…

2.13Epd 中景园2.13寸电子墨水屏 显示原理(局部刷新指令)

显示有两种模式&#xff1a; 1、MCU RAM 操作之后一起写入显示屏的RAM 在MCU上分配一个成员大小为8位的数组 长度是像素点数的1/8(一位控制一个像素点) 如图&#xff1a;数组是Image_BW 之后是用 显示的操作算法将每个点由对应的数字或字母 汉字的字模写入数组中 最后将数组一起…

如何尽早发现潜在开发风险,降低项目风险?

1、提前规划风险预防和控制策略 针对开发流程中各环节可能存在的风险&#xff0c;项目经理需进行科学的项目风险分析&#xff0c;提前进行科学地规划和部署&#xff0c;制定符合项目特点的风险评估和监督机制&#xff0c;实行岗位负责制&#xff0c;提前制定控制策略&#xff0…

mac配置MySQL环境

对于开发人员来说&#xff0c;只需要安装MySQL Server 和 MySQL Workbench这两个软件&#xff0c;这样就可以满足开发需求 MySQL Server&#xff1a;专门用来提供数据存储和服务的软件 MySQL Workbench:&#xff1a;可视化的MySQL管理工具&#xff0c;通过他&#xff0c;可以方…

ArcGIS中栅格计算器常用函数的使用

先看下目录 一、 ArcGlS中栅格计算器简介 栅格计算器位置及界面布局 二、 ArcGIS棚格计算器中Con&#xff08;&#xff09;函数的使用 &#xff08;一&#xff09; Con&#xff08;&#xff09;函数的用法 &#xff08;二&#xff09; ArcGIS 案例操作 三、 ArcGIS栅格计算…