详解C语言分支与循环语句

分支语句

  • if else
  • switch

循环语句

  • while
  • for
  • do while

goto语句

文章目录

  • 1.什么是语句
  • 2.分支语句(选择结构)
  • 2.1 if语句
      • 2.1.1 悬空else
      • 2.1.3 练习
  • 2.2 switch语句
      • 2.2.1 在switch语句中的break
      • 2.2.2 default子句
  • 3.循环语句
    • 3.1 while循环
      • 3.1.1 while语句中的break和continue
    • 3.2 for循环
      • 3.2.1 语法
      • 3.2.2 break和continue在for循环中
      • 3.2.3 for语句的循环控制变量
      • 3.2.4 一些for循环的变种
      • 3.2.5 试题
    • 3.3 do...while()循环
      • 3.3.1 do...while()循环语法
      • 3.3.2 执行流程
      • 3.3.3 do语句的特点
      • 3.3.4 do while 循环中的break和continue
    • 3.4 习题
      • 3.4.3 猜数字游戏
  • 4.goto语句

1.什么是语句

在C语言当中语句可以分为以下5类:

  • 表达式语句
  • 函数调用语句
  • 控制语句
  • 复合语句
  • 空语句
    控制语句 用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句符号符组成,C语言有9种控制语句:

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

2.分支语句(选择结构)

这样吧,你先在steam搜索“千恋*万花”点击购买安装好后立即运行打开千恋万花,在主页面点击开始游戏进入游戏页面,然后依次选择“说实话”、“不好说”、“觉得很可爱”、“单独行动”、“摸摸头”、“有点担心”和“安抚”进入丛雨路线
没错,galgame中的选项就是选择语句。
分支语句

达成对应的条件后就进入对应的结果。

2.1 if语句

if语句的语法结构

//单分支
if(exp1)语句;
//双分支
if(exp1)语句1;
else语句2;//多分支
if(exp1)语句1;
else if(exp2)语句2;
else语句3;

实例演示:

//代码1
#include <stdio.h>
int main()
{int age = 0;scanf("%d",&age);if(age<18){printf("未成年\n");}else{printf("已成年\n");}return 0;
}//代码2
#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<60){printf("中年\n");}else if(age>=60&&age<80){printf("老年\n");}else{printf("寿星\n");}return 0;
}

在C语言中0表示假,非0表示真
值得注意的是:If只能管理后面一条语句,所有我们要多用{}进行匹配,防止使人误解.
{}就是一个代码块。

2.1.1 悬空else

看下面这个代码:

#include <stdio.h>
int main()
{int a = 0;if(a)if(a==0)printf("hello\n");elseprintf("hi\n");return 0;
}

你觉得会打印什么呢?
答案是:什么都不打印,这里的else是和第二个if进行匹配的。
为了避免这种情况,我们要让代码好好对齐或者加入{}来避免误解


//代码对齐
#include <stdio.h>
int main()
{int a = 0;if(a)if(a==0)printf("hello\n");elseprintf("hi\n");return 0;
}//利用{}
#include <stdio.h>
int main()
{int a = 0;if(a){if(a==0)printf("hello\n");elseprintf("hi\n");}return 0;
}

else的匹配:else是和离他最近的if匹配的

2.1.3 练习

1.判断一个数是否是奇数。
2.输出1~100之间的奇数。

//1.判断一个数是否是奇数。
#include <stdio.h>
int main()
{int a = 0;scanf("%d",&a);if(a%2==1){printf("是奇数!\n");}else{printf("不是奇数!\n");}return 0;
}//2.2.输出1~100之间的奇数。
#include <stdio.h>
int main()
{//利用while循环int i = 1;while(i<=100){if(i%2==1){printf("%d ",i);}++i;}return 0;
}//方法2
#include <stdio.h>
int main()
{//利用while循环int i = 1;while(i<=100){printf("%d ",i);i+=2;}return 0;
}

2.2 switch语句

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

switch(整型表达式)
{case 整型常量表达式://case是整型常量表达式 也可以是char 因为底层为ASCII码也算语句;
}

比如,让你根据数字输出对应的星期。

#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;
}//当我们输入5时
/*
打印结果:
星期五
星期六
星期日
*/

这是为什么呢?因为在switch中我们只有利用了break才能实现真正的分支。

2.2.1 在switch语句中的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;
}
//当我们输入5时
/*
打印结果:
星期五
*/

break语句的实际效果是把语句列表划分为不同的分支部分。
思考:如果有人在这个程序运行时输入8会怎么样?

2.2.2 default子句

答案:当输入的值与所有case都不匹配时,就直接退出switch,然后继续程序。
但是如果你不想要忽略不匹配这种情况。
你可以在语句列表中增加一个default子句。
可以写在任何一个case标签可以出现的位置,switch里面的判断可以没有顺序。

#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;default:printf("输入错误!\n");break;//建议加上	}return 0;
}

switch允许嵌套使用。

3.循环语句

  • while
  • for
  • do while
    简单的循环结构

简单的循环语句

3.1 while循环

while(条件)语句;

当条件满足时,循环就会执行下去。
while语句执行流程:
while语句的执行流程

打印1-10数字

#include <stdio.h>
int main()
{//利用while循环int i = 1;while(i<=10){printf("%d ",i);i++;}return 0;
}
//打印结果
//1 2 3 4 5 6 7 8 9 10

3.1.1 while语句中的break和continue

break介绍
在循环中只要执行了break,就会直接终止循环,直接跳出循环体。

#include <stdio.h>
int main()
{//利用while循环int i = 1;while(i<=10){if(i==5)break;printf("%d ",i);i++;}return 0;
}
//打印结果
//1 2 3 4 

continue介绍

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

//代码1
#include <stdio.h>
int main()
{//利用while循环int i = 1;while(i<=10){if(i==5)continue;printf("%d ",i);i++;}return 0;
}
//打印结果
//1 2 3 4 4 4 4 4 4 4 4....//代码2
#include <stdio.h>
int main()
{//利用while循环int i = 1;while(i<=10){i++;if(i==5)continue;printf("%d ",i);}return 0;
}
//打印结果
//2 3 4 6 7 8 9 10

3.2 for循环

了解完while循环后,for可以说是while的整合。

3.2.1 语法

for(expr1;expr2;expr3)循环语句;

exp1
为初始化部分,用来初始化循环变量的。
exp2
为条件判断部分,用于判断循环终止的
exp3
为调整部分,用于循环条件的调整。

打印1-10

//代码1
#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 10//代码2
#include <stdio.h>
int main()
{for(int i = 1;i<=10;++i)//在里面初始化是c++里的写法,但在c99标准后引入{printf("%d ",i);}return 0;
}
//打印结果:1 2 3 4 5 6 7 8 9 10

for执行流程图
for语句的执行流程

for与while循环的对比

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

循环的3个必要条件,无论是while循环还是for都是有的,但是while的三部分比较分散。
查找修改就不够集中于方便,对此,for循环的风格更胜一筹。

3.2.2 break和continue在for循环中

可以发现的是,在for和在while循环里面是没有特别大区别的,但由于for独特的执行调整步骤和while还是略有差异

//continue在while
#include <stdio.h>
int main()
{//利用while循环int i = 1;while(i<=10){if(i==5)continue;printf("%d ",i);i++;}return 0;
}
//打印结果
//1 2 3 4 4 4 4 4 4 4 4....//continue在for循环
#include <stdio.h>
int main()
{//利用for循环int i = 1;for(i = 1;i<=10;++i){if(i==5)continue;printf("%d ",i);}return 0;
}
//打印结果
//1 2 3 4 6 7 8 9 10

for循环里的continue在跳过本次循环时,是无法跳过for()中的调整语句的。

3.2.3 for语句的循环控制变量

建议(不是必须):

1.不要在for循环体内修改循环变量,防止for循环失去控制
2.建议for语句的循环变量的取值采用 前闭后开区间的写法

int i = 0;
//前闭后开
for(i = 0;i<10;++i)
{}
//前闭后闭
for(i = 0;i<=9;++i)
{}

3.2.4 一些for循环的变种

#include <stdio.h>
int main()
{//利用for循环int i = 1;for(;;)//for省略判断即为判断恒为真{printf("hello\n");}//代码2int i = 0;int j = 0;//打印多少个hello呢?for(i = 0;i<10;++i){for(j = 0;j<10;++j){printf("hello\n");}}//100个//代码3int i = 0;int j = 0;//打印多少个hello呢?for(;i<10;++i){for(;j<10;++j){printf("hello\n");}}//10个//代码4 int x,y;for(x = 0,y = 0;x<2&&y<5;++x,++y)//使用多个变量控制循环{printf("hello\n");}return 0;
}
//打印结果
//hello hello hello...

3.2.5 试题

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

3.3 do…while()循环

3.3.1 do…while()循环语法

do
{循环语句;
}while(表达式);

3.3.2 执行流程

do while的执行流程

3.3.3 do语句的特点

循环至少执行一次,使用场景有限,不常使用。

打印1-10

#include <stdio.h>
int main()
{int i = 1;do{printf("%d ",i);++i;}while(i<=10);return 0;
}
// 打印结果:
//1 2 3 4 5 6 7 8 9 10

3.3.4 do while 循环中的break和continue

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

3.4 习题

1.计算n的阶乘
2.计算1!+2!+…+10!
3.在一个有序数组中查找具体某个数n
4.编写代码,演示多个字符从两端移动,向中间汇聚。

//1.
#include <stdio.h>
int main()
{int n = 0;scanf("%d",&n);int ret = 1;for(int i = 1;i<=n){ret*=i;}printf("%d\n",ret);return 0;
}//2.1
#include <stdio.h>
int main()
{int sum = 0;for(int n = 1;n<=10;++n){int ret = 1;for(int i = 1;i<=n;++i){ret*=i;}sum+=ret;}printf("%d\n",sum);return 0;
} //2.2
#include <stdio.h>
int main()
{int sum = 0;int ret = 1;for(int n = 1;n<=10;++n){ret *= n;sum+=ret;}printf("%d\n",sum);return 0;
}//3.1
#include <stdio.h>
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};int x = 0;scanf("%d",&x);for(int i = 0;i<10;++i){if(x==arr[i]){printf("找到了,下标为%d\n",i);break;}}if(i==10){printf("没找到!\n");}return 0;
}
//3.2二分查找
#include <stdio.h>
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};int x = 0;scanf("%d",&x);int left = 0,right = 9;int flag = 0;while(left<=right){int mid = (left+right)/2;if(arr[mid]==x){printf("找到了,下标为%d\n",mid);flag = 1;break;}else if(arr[mid]<x){left = mid+1;}else{right = mid-1;}}if(flag == 0){printf("找不到!\n");}return 0;
}//4
#include <stdio.h>
int main()
{char arr1[] = "hello world!";char arr2[] = "************";int n = sizeof(arr1);int left = 0;int right = n - 1;for (left = 0, right = n - 1; left <= right; ++left, --right){arr2[left] = arr1[left];arr2[right] = arr1[right];printf("%s\n", arr2);}return 0;
}

3.4.3 猜数字游戏

学以上的内容,我们可以写一个简单的猜谜游戏

#include <stdio.h>
#include <stdlib.h>//srand和rand的头文件
#include <time.h>//time的头文件
void menu()
{printf("**********************\n");printf("*****1.paly***********\n");printf("*****0.exit***********\n");printf("**********************\n");
}
void game()
{int r = rand() % 100 + 1;//rand可以产生随机数,但因为rand的随机数是根据srand所提供的种子生成,所以我们还要使用srand,但是由由于srand所提供的种子也要输入数字才可以生成,为此我在使用了time函数生成当前时间的时间戳数来充当输入的数字,以达到rand生成随机数的效果。int guess = 0;//玩家要猜测的数printf("游戏开始\n");while (1)//直到猜中{scanf("%d", &guess);if (guess < r){printf("猜小了\n");}else if (guess > r){printf("猜大了\n");}else{printf("恭喜你,猜中了!\n");break;}}
}
int main()
{int input = 0;srand((unsigned)time(NULL));do//进入循环{menu();//打印菜单printf("请选择_>");//提示信息scanf("%d", &input);//根据提示选择进入还是退出//根据输入进入相应区域,用到多分支语句switchswitch (input){case 1:game();//进入游戏break;case 0:printf("已退出游戏!\n");break;default:printf("输入错误!\n");break;}} while (input);}

4.goto语句

C语言中提供了可以随意滥用的goto语句和标记跳转的标号。
从理论上来讲goto语句是没有必要的,实际中没有goto语句也可以很容易的写成代码。
但是在某些场合下goto语句还是用的着的,最常见的用法就是终止某些深层嵌套的结构。
例如一次性跳出多层循环。
多重循环下使用break是达不到目的的,break只能从最内层循环退出到上一层循环。

for(...)
{for(...){for(...){if(disaster)goto error;}}
}
error:if(disaster)//处理错误情况

大部分部分使用goto的情况是可以利用循环代替的。

//代码1
#include <stdio.h>
int main()
{
again://...if(...){//...break;}else{goto again;}return 0;
}//代码2
#include <stdio.h>
int main()
{while(1){if(...){//...break;}}return 0;
}

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

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

相关文章

【Linux进程通信】使用匿名管道制作一个简单的进程池

进程池是什么呢&#xff1f;我们可以类比内存池的概念来理解进程池。 内存池 内存池是在真正使用内存之前&#xff0c;先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时&#xff0c;就从内存池中分出一部分内存块&#xff0c;若内存块不够再继…

web权限到系统权限 内网学习第一天 权限提升 使用手工还是cs???msf可以不??

现在开始学习内网的相关的知识了&#xff0c;我们在拿下web权限过后&#xff0c;我们要看自己拿下的是什么权限&#xff0c;可能是普通的用户权限&#xff0c;这个连添加用户都不可以&#xff0c;这个时候我们就要进行权限提升操作了。 权限提升这点与我们后门进行内网渗透是乘…

MySQL:设计数据库与操作

设计数据库 1. 数据建模1.1 概念模型1.2 逻辑模型1.3 实体模型主键外键外键约束 2. 标准化2.1 第一范式2.2 链接表2.3 第二范式2.4 第三范式 3. 数据库模型修改3.1 模型的正向工程3.2 同步数据库模型3.3 模型的逆向工程3.4 实际应用建议 4. 数据库实体模型4.1 创建和删除数据库…

Linux 磁盘空间清理

1.检查磁盘使用情况 #显示每个挂载点的磁盘使用量&#xff0c;以及可用空间和使用率 df -h #显示当前目录的全部文件和目录&#xff08;包括隐藏的&#xff09;,以MB显示 ll -h 2. du查看最大的目录或文件 #逐级检查某个目录下各个子目录的大小。从根目录开始&#xff0c;逐级…

基于x86+FPGA+AI轴承缺陷视觉检测系统,摇枕弹簧智能检测系统

一、承缺陷视觉检测系统 应用场景 轴类零件自动检测设备&#xff0c;集光、机、软件、硬件&#xff0c;智能图像处理等先进技术于一体&#xff0c;利用轮廓特征匹配&#xff0c;目标与定位&#xff0c;区域选取&#xff0c;边缘提取&#xff0c;模糊运算等算法实现人工智能高…

提高候选人的招聘感受:成功的策略

大约78%的候选人表示&#xff0c;他们的整体应聘体验表明企业对员工的关注。然而&#xff0c;超过一半的候选人透露&#xff0c;他们在招聘过程中有过负面的候选人经历&#xff0c;80%的候选人在经历了令人失望的招聘过程后会公开与他人分享他们的不良经历。 但也有一线希望&am…

某某市信息科技学业水平测试软件打开加载失败逆向分析(笔记)

引言&#xff1a;笔者在工作过程中&#xff0c;用户上报某某市信息科技学业水平测试软件在云电脑上打开初始化的情况下出现了加载和绑定机器失败的问题。一般情况下&#xff0c;在实体机上用户进行登录后&#xff0c;用户的账号信息跟主机的机器码进行绑定然后保存到配置文件&a…

第十四届蓝桥杯省赛C++B组E题【接龙数列】题解(AC)

需求分析 题目要求最少删掉多少个数后&#xff0c;使得数列变为接龙数列。 相当于题目要求求出数组中的最长接龙子序列。 题目分析 对于一个数能不能放到接龙数列中&#xff0c;只关系到这个数的第一位和最后一位&#xff0c;所以我们可以先对数组进行预处理&#xff0c;将…

C++初学者指南-3.自定义类型(第一部分)-析构函数

C初学者指南-3.自定义类型(第一部分)-析构函数 文章目录 C初学者指南-3.自定义类型(第一部分)-析构函数特殊的成员函数用户定义的构造函数和析构函数RAII示例&#xff1a;资源处理示例&#xff1a;RAII记录零规则 特殊的成员函数 T::T()默认构造函数当创建新的 T 对象时运行。…

电脑录音方法:电脑怎么录音?5招轻松搞定录音!

想要从麦克风或系统音频录制电脑声音吗&#xff1f;这是一项简单的任务。本文将为您介绍5种最佳且最简单的方法&#xff0c;包括使用Windows系统自带的录音工具来录制电脑音频&#xff0c;在线音频录音软件和专业的第三方电脑录音软件。这些工具都能够很好地帮助您完成电脑怎么…

一款十六进制编辑器,你的瑞士军刀!!【送源码】

软件介绍 ImHex是一款功能强大的十六进制编辑器&#xff0c;专为逆向工程师、程序员以及夜间工作的用户设计。它不仅提供了基础的二进制数据编辑功能&#xff0c;还集成了一系列高级特性&#xff0c;使其成为分析和修改二进制文件的理想工具。 功能特点 专为逆向工程、编程和夜…

verilog实现PID控制

1 原理讲解 距离上一次说PID算法的事情过去蛮久了&#xff0c;今天又重新看了看PID的代码&#xff0c;其实还是存在一些不合理的地方。 整理归纳了一下原理&#xff0c;位置式和增量式的变化。 2 工程实现 timescale 1ns / 1psmodule pid_controller(input clk,input r…

【ARM系列】GIC600AE功能安全

GIC600AE在原GIC600版本基础上增加了FuSa功能&#xff0c;所增加的FuSa特性都集成在GIC600外围&#xff0c;不会改变原GIC600的功能。 GIC600AE主要安全机制分布图&#xff1a; GIC-600AE包含以下FuSa安全机制&#xff1a; lockstep logic protection 通过添加duplication l…

C++ 类与对象(中)

C 类与对象&#xff08;中&#xff09; 1. 类的6个默认成员函数2. 构造函数2.1 概念2.2 特性 3.析构函数3.1 概念3.2 特性 4. 拷贝构造函数4.1 概念4.2 特征 5.赋值运算符重载5.1 运算符重载5.2 赋值运算符重载 1. 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c…

数据库操作-DML和DQL

DML DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。 添加数据&#xff08;INSERT&#xff09; 1.指定字段添加数据&#xff1a; insert into 表名 ( 字段名 1, 字段名 2) values ( 值 1, 值 2); 2…

【面试题】TLS和SSL协议的区别

TLS&#xff08;Transport Layer Security&#xff09;和SSL&#xff08;Secure Sockets Layer&#xff09;协议都是用于在网络上建立安全通信连接的协议&#xff0c;但它们在多个方面存在区别。以下是TLS和SSL协议之间区别的详细分析&#xff1a; 1. 发展历程与标准化 SSL&a…

企业本地大模型用Ollama+Open WebUI+Stable Diffusion可视化问答及画图

最近在尝试搭建公司内部用户的大模型&#xff0c;可视化回答&#xff0c;并让它能画图出来&#xff0c; 主要包括四块&#xff1a; Ollama 管理和下载各个模型的工具Open WebUI 友好的对话界面Stable Diffusion 绘图工具Docker 部署在容器里&#xff0c;提高效率 以上运行环境…

20240627构造专题

写在前面&#xff1a;出场即巅峰&#xff08;明日模拟赛RP&#xff09; 一.何为构造 就是通过对一道题题面的分析可以发现某种规律&#xff08;类似于不完全归纳法&#xff09;&#xff0c;然后发掘本质&#xff0c;就可以很快的解题&#xff0c;但是显然我还没有掌握 二.一…

基于星火大模型的群聊对话分角色要素提取挑战赛Task1笔记

基于星火大模型的群聊对话分角色要素提取挑战赛Task1笔记 跑通baseline 1、安装依赖 下载相应的数据库 !pip install --upgrade -q spark_ai_python2、配置导入 导入必要的包。 from sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler from sparkai.core.messages…

操作系统大题复习

磁盘调度算法 一次磁盘读写需要的时间 寻道时间 先来先服务FCFS 优点&#xff1a;公平 缺点&#xff1a;性能差&#xff0c;寻道时间长 最短寻道时间有限SSTF 缺点&#xff1a;可能产生饥饿现象 扫描算法SCAN 优点&#xff1a;不会产生饥饿现象 缺点&#xff1a;响应频率…