C语言初阶之分支与循环
前言
C语言是一门结构化的程序设计语言,主要分为三种结构:
- 顺序结构
- 选择结构
- 循环结构
分支语句和循环语句
问:什么是语句?答:C语言中由一个分号;
隔开的就是一个语句
分支语句
- if
- switch
循环语句
- while
- for
- do while
goto语句
一、分支语句(选择结构)
举个栗子:当你站在学习的分岔口时,你可以选择是否学习,然后当有一天你遇到了改变你命运的机会,那么这个时候:
好好学习+机遇=人生巅峰;不好好学习+机遇=回家放羊;
这就是选择,我们的每一个选择都决定着我们的人生(这个时候请富二代自行划走)。
1.if语句
if语句的三种语法结构:
if(表达式) //如果表达式为真,则执行语句
语句;
if(表达式)
语句1;
else(表达式)
语句2;
if(表达式)
语句1;
else if(表达式)
语句2;
else
语句3;
例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int age = 10;
if(age>0 && 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<150)
printf("老年\n");
else
{
printf("输入错误\n");
printf("请更改\n");
}
return 0;
}
- 解释(如果表达式为真,则执行语句):在C语言中如何表示真假:0表示假,非0表示真
- if语句怎样使用多条语句:使用代码块{ },将语句放置在花括号中
错误示例(悬空else):
#include <stdio.h>
int main()
{
int x=0;
int s=1;
if(x==1)// == 判断相等;= 赋值
if(s==1)
printf("文字\n");
else
printf("数字\n");
return 0;
}
-
注意:这种情况程序不执行
-
原因:第一个表达式(x=1)不为真,并且没有else与之匹配,else与离它最近且未匹配的if进行配对。
适当的使用{}可以使代码的逻辑更加清楚,良好的代码风格很重要
例:
//对比1
if(condition)
{
return x;
}
return y;
//----------
if(condition)
{
return x;
}
else
{
return y;
}
//对比2
int num = 1;
if(num == 5)
{
printf("hello\n");
}
//----------
int num = 1;
if(5 == num)
{
printf("hello\n");
}
2.switch语句
switch语句也是分支语句的一种,它常常用于多分支的情况。
因为一直使用else if太麻烦了,所以有了switch语句。
switch(整型表达式)
{
语句项;
}
语句项就是一些case语句:
case 整形常量表达式:
语句;
例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int win = 0;
printf("请输入数字:");
scanf("%d",&win);
switch(win)
{
case 1:
printf("IG");
break;
case 2:
printf("FPX");
break;
case 3:
printf("EDG");
break;
case 4:
printf("RNG");
break;
case 5:
printf("TES");
break;
default:
printf("输入错误");
break;
}
return 0;
}
注意:
1.想输出单个分支内容
在switch语句中,我们没办法直接实现分支,所以需要搭配break使用,break的实际效果就是把语句列表划分为不同的部分。
2.default语句
如果输入的东西与所有的case标签都不一样,可以加入一条default语句,程序就会执行default语句的内容,每个switch语句只能有一个default子句,但是它可以出现在语句列表的任何位置,语句流会向贯穿case标签一样贯穿default子句。
二、循环语句
再举个栗子:当你再次站在学习的分岔口时,这个时候你不一样了,你有身份,你是世界第二富的儿子,你还是可以选择是否学习:
好好学习+机遇=人生巅峰;不好好学习+自己制造机遇=人生巅峰;不好好学习+金钱的力量=人生巅峰;
1.while循环
我们已经了解了if语句,当满足条件时,if语句的执行只会执行一次,但实际上,同一件事,我们需要完成很多次,这个时候就需要用到while语句来帮助我们实现循环。
while语法结构:
while(表达式)
循环语句;
例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int s = 1;
while(s<=10)
{
/*
if(s==9)
continue;
如果加上,会进入一个死循环,因为s++写在后面,
当s等于9时,跳过了后面的代码,包括s++,
所以s数值不变,返回循环是依然是9。
*/
printf("%d\n",s );
s++;
}
return 0;
}
补充:
continue
:用于终止循环中本次循环continue后的代码,直接跳到下一次循环入口。
break
:用于停止后面的所有循环,直接终止。
2.for循环
for(表达式1;表达式2;表达式3)
循环语句;
- 表达式1为初始化部分,用来初始化循环变量
- 表达式2为条件判断部分,用于判断循环什么时候终止
- 表达式3为调整部分,用于循环条件的调整
例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int s = 0;
for(s=1;s<=10;s++)
printf("%d\n",s);
return 0;
}
一些for循环的变种
#include <stdio.h>
#include <stdlib.h>
int main()
{
//变种1
for(;;)
{
printf("hello\n");
}
//变种2
int x, y;
for (x = 0,y = 0 ; x<2 && y<5 ; ++x,y++)
{
printf("hello\n");
}
return 0;
}
for循环例题
请问循环要循环多少次?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int k = 0;
for(i = 0,k = 0;k = 0;i++,k++)
k++;
return 0;
}
循环进行了0次,k = 0,将0赋值给了k,0为假。
对比for循环与while循环
1.在while循环中依然存在循环的三个必要条件,但由于风格问题使它们离的比较远,所以修改不够集中和方便,与之相比,for循环风格更好,所以for循环的使用频率较高。
2.for循环中也可以使用break和continue,意义和while循环中的一样,只不过因为for循环的条件判断部分在前边,所以当使用continue是不会陷入死循环。
建议:
不可以在for循环体内修改循环变量,防止for循环失去控制
for循环的循环控制变量的取值采用“前闭后开区间”写法
3.do while循环
do语句的语法:
do
循环语句;
while(表达式);
例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int s = 1;
do
{
printf("%d\n",s);
s++;
}
while(s<=10);
return 0;
}
do语句特点:
循环至少执行一次,使用的场景有限,所以不是经常使用。
折半查找算法
例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int left = 0;
int right = sizeof(arr)/sizeof(arr[0])-1;
int key = 7;
int mid = 0;
while(left<=right)
{
mid = (left+right)/2;
if(arr[mid]>key)
{
right = mid-1;
}
else if(arr[mid] < key)
{
left = mid+1;
}
else
break;
}
if(left <= right)
printf("找到了,下标是%d\n", mid);
else
printf("找不到\n");
}
如果实现一个二分查找函数:
int bin_search(int arr[], int left, int right, int key)
{
int mid = 0;
while(left<=right)
{
mid = (left+right)>>1;
if(arr[mid]>key)
{
right = mid-1;
}
else if(arr[mid] < key)
{
left = mid+1;
}
else
return mid;//找到了,返回下标
}
return -1;//找不到
}
三、goto语句
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。
这种情况使用break是达不到目的的,它只能从最内层循环退出到上一层的循环。
下面是使用goto语句的一个例子:一个关机程序
#include <stdio.h>
#include <stdlib.h>
int main()
{
char input[10] = {0};
system("shutdown -s -t 60");
again:
printf("电脑将在1分钟内关机,如果输入 停止 ,就取消关机!\n请输入:");
scanf("%s", input);
if(0 == strcmp(input,"停止"))
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
goto语言真正适合的场景如下:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 处理错误情况
结尾
分支与循环的内容就到此结束了,但是学习是不可以停止的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)