C语言分支与循环

目录

一:分支——if 和 switch

一:if 用法

1. if 语句语法

2. if语句 的嵌套

3.悬空else问题

二:switch 用法

 1. switch 的语句语法

2. switch 语句中的 break

3.switch语句中的default

二:循环——for 和while 

 一: for 用法

1. for 的语法结构

2. break 和 continue

二:while 用法

 1. while 的语句语法

2.do...while

三:循环的嵌套


一:分支——if 和 switch

一:if 用法

1. if 语句语法

if(表达式) 

{语句n;}

表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏ 。

if 默认只控制⼀条语句。当语句为一个时,可以不使用{ };多语句时,一定要使用{ },否则只执行一条语句。

如下列代码:

int a = 1;
if (a == 0)
printf("a为0\n");
printf("a==0\n");
//运行结果
a==0

若添加{ },则两句皆不执行

int a = 1;
if (a == 0)
{
printf("a为0\n");
printf("a==0\n");

}

注意: 上述代码中a==0 表达式中时“ ==” 而不是“=”“ ==”是关系操作符,若相等,则传递1,不相等,则传递0。“ = ”是赋值运算符,赋予a的值为0。

2. if语句 的嵌套
在学习 if 的嵌套之前,要先了解一下if...else。翻译成中文:“如果是,......;否则,......。”
if(表达式)
{
语句n; }
else                  //需要格外注意: else后面不能接表达式
{
语句n; }

 第一种嵌套:else 后面接 if。相当于 if 嵌套在 else语句中。

下图中红色部分为 嵌套的 if

# include <stdio.h>
int main ()
{
int num = 0 ;
scanf ( "%d" , &num);
if (num == 0 )
printf ( " 输⼊的数字是 0\n" );
else if(num > 0)          //这⾥的if 相当于嵌套在else语句中,形成了嵌套结构
printf("输⼊的数字是正数\n");
else
printf("输⼊的数字是负数\n");
return 0 ;
}

第二种嵌套: if 里面接 if。相当于 if 嵌套在上一级 if 中。

下图中红色部分为 嵌套的 if

# include <stdio.h>
int main ()
{
int num = 0 ;
scanf ( "%d" , &num);
if (num> 0 )
{
if(num%2 == 0)        //这里 if 相当于镶嵌在 if 语句中,形成了嵌套结构
printf("偶数\n");
else
printf("奇数\n");
}
else
{
printf ( " ⾮正数 \n" );
}
return 0 ;
}
3.悬空else问题
如果有多个 if else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配
int main()
 {
 int a = 0;
 int b = 2;
if(a == 1)
 if(b == 2)
 printf("hehe\n");
else
 printf("haha\n");
return 0;
}

此代码运行结果是

   

为什么运行结果是什么都没输出呢?我们将代码换一个表达形式就很好理解了

else只与第二个 if 匹配,不与第一个 if 匹配。后边的 if...else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不 成⽴,嵌套 if else 就没机会执⾏了,最终啥都不打印。

#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;
}
如果我们希望else确实和第⼀个 if 匹配,则需要用{}将第二个 if 括起来。如下
int main()
{
 int a = 0;
 int b = 2;
 if(a == 1)
 {
 if(b == 2)
 printf("hehe\n");
 }
 else
 {
 printf("haha\n");           //输出结果为 : haha
 }
 return 0;
}

 由此可见,在使用 if 时,最好添加{ },增加阅读的可读性。

二:switch 用法

 1. switch 的语句语法
根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值, 就执⾏ default 分⽀
switch (expression) {
case value1:  statement
break ;
case value2:  statement
break ;
default :  statement
break ;
}

注意:

  • switch 后的 expression 必须是整型表达式 ,case 后的值,必须是整形常量表达式。value 也可以是 字符。如 case 整数 :或者 case ' 字符 ' 。value 不能为 小数 或者 字符串 等。
  • case 与 value 之间须有空格,将二者间隔分开。
2. switch 语句中的 break

break 作用是跳出该case value n 的表达语句。每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,否则将会顺序走完接下来的代码,直到遇见 break 或者 其他结束语句才会终止switch。

#include <stdio.h>
int main()
{
 int n = 0;                           
 scanf("%d", &n);
 switch(n%3)
 {
 case 0:                               
 printf("整除,余数为0\n"); 
 case 1:
 printf("余数是1\n"); 
 case 2:
 printf("余数是2\n"); 
 }
 return 0;
}
//运行结果
3
整除,余数为0
余数是1
余数是2
switch 语句是分⽀效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch 语 句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续往下执⾏,有可能执⾏其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。如上述代码,输入3后,结果为0。选择进入case 0 中,

因为缺少break,在运行完case 0后无法跳出switch,只能继续运行下列其他case直到整个switch语句运行结束。 

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

3.switch语句中的default

default 作用:

switch 的表达式中的值⽆法匹 配代码中的 case 语句的时候,如果没有default ,直接跳出switch,不执行任何语句;如果存在 dafault , 执行default 中的语句。

default 与case 的位置关系:

在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实 际需求的就可以。 不过我们通常是把 default ⼦句放在最后处理的。

#include <stdio.h>
int main()
{
 int a;
 scanf("%d", &a);
 
 switch(a)
 {
 default:
 printf("输⼊错误\n");
 break;
 case 1:
 case 2:
 case 3:
 printf("haha\n");
 break;
 case 4:
 case 5:
 printf("hehe\n");
 break;
 
 }
 return 0;
}
//运行结果一
2
haha
//运行结果二
5
hehe
//运行结果三
7
输入错误

:循环——for 和while 

 一: for 用法

1. for 的语法结构

for (初始化 ;判断条件 ;调整表达式) 或者  for (判断条件)

判断条件成⽴(为真),则语句继续循环执⾏;表达式不成⽴(为假),则语句不执⾏,跳出循环 。if 默认只控制⼀条语句。当语句为一个时,可以不使用{ };多语句时,一定要使用{ },否则只执行一条语句。

#include <stdio.h>
int main()
{
 for(int i=1;i<=10;i++)
 {
 printf("%d ", i); 
 }
 return 0;
}
//运行结果
1 2 3 4 5 6 7 8 9 10
2. break 和 continue
break 的作⽤:永久的终⽌循环,只要 break 被执⾏, break 外的第⼀层循环就终⽌了。
continue 的作⽤:跳过本次循环中 continue 后边的代码,继续进⾏ 下⼀次循环的判断。

#include <stdio.h>
int main()
{
for (int a = 1, b = 1; b <20; b++)
 {
	if (b >10)
	 break;
	if (3<b&&b<8)
	 continue;
	a++;
	printf("%d",a);
}
return 0;
}
//运行结果
2 3 4 5 6 7

//删去 continue 运行结果
1 1 1 2 3 4 5 5 5 5

//删去 break 运行结果
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

 第一种:当b=1、2、3、8、9、10时,执行a++;当b=4、5、6、7时,执行continue ,跳过a++;当b>10时,直接跳出整个for循环。

第二种:当b=1、2、3、8、9、10时,因为 if 只控制一条语句,不执行a++,但执行printf( )函数;当b=4、5、6、7时,执行a++和printf( )函数,输出2、3、4、5;当b>10时,直接跳出整个for循环。

第三种:当b<=10时,第一个if语句条件不满足,不执行第二个if语句,所以continue不执行,执行a++和printf( )函数;当b>10时,第一个条件满足,但删除了break,所以执行第二个 if 语句,此时b不满足第二个 if 语句条件,所以continue不执行,执行a++和printf( )函数

break 和 continue 不仅适用于for,也同样适用于while,所以while 处就不进行赘述。

二:while 用法

 1. while 的语句语法
while ( 表达式 )
{
语句;
}

表达式成⽴(为真),则语句继续循环执⾏;表达式不成⽴(为假),则语句不执⾏,跳出循环 。while默认只控制⼀条语句。当语句为一个时,可以不使用{ };多语句时,一定要使用{ },否则只执行一条语句。

#include <stdio.h>
int main()
{
 int i = 1;
 while(i<=10)
 {
 printf("%d ", i);
 i = i+1;
 }
 return 0;
}
//运行结果
1 2 3 4 5 6 7 8 9 10
2.do...while
do
{
语句;}
while ( 表达式 )

 do ...while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。至少执行一次程序。

而while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳 出循环。至少执行0次程序。

//do...while 编写
#include <stdio.h>
int main()
{
 int n = 0;
 scanf("%d", &n);
 int cnt = 0;
 do
 {
 cnt++;
 n = n / 10;
 } while (n);
 printf("%d\n", cnt);
 return 0;
}
//while 编写
#include <stdio.h>
int main()
{
int n=0;
scanf("%d", &n);
int cnt = 0;
if(n==0)
{ 
printf("1");}
else{
while (num!=0) {
cnt++;
n= n / 10;
	}
printf("%d\n", cnt);
}
return 0;
}

这两种代码的运行结果都是一样的。 

三:循环的嵌套

while , for , do...while 三者可以镶嵌在一起解决问题。如此代码,求100~200之间的素数

#include <stdio.h>
#include <math.h>
int main()
{int i = 100,j = 100,n = 0;
int m;
while (i <= 200) {
		m = 0;

		for (j = 2; j < sqrt(i); j++) {
			n = i % j;
			if (n == 0)
			{
				m = 1;
				break;
			}
		}
		if(m==0)
		printf("%d\t ", i);
		i++;

	}
return 0;
}

ps:初涉C语言,有问题处,望各位斧正

  • 36
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值