C语言的分支结构(详解)

  纯小白一个,如果有写的不对的地方,欢迎大家提出错误

下面让我们开始学习吧!         

        C语言是结构化的程序设计语言,这里的结构是 顺序结构、选择结构、循环结构。

        C语言能实现这三种结构,其实我们生活中,所有的事情都可以拆分为这三种结构或者这三种结构的组合。

        我们可以使⽤ if switch 实现分⽀结构,使⽤ for while do while 实现循环结构。

在这篇文章中,首先来介绍 if、switch 分支结构。

1、if 语句

if语句的语法形式:

if (表达式)
     语句
表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏
也就是说,在C语言中,0为假,非0表示真。
更简单来说就是表达式的结果是0的话,则语句不执行,表达式结果不是0的话,则语句执行。
这里来举一个例子:输入一个整数,判断是否为奇数
这样就可以用我们上面来讲的 if  语句来执行。
上代码!
#include <stdio.h>
int main()
{
 int num = 0;
 scanf("%d", &num);
 if(num % 2 == 1)
 printf("%d 是奇数\n", num);
 return 0;
}

首先来看这个代码,定义一个整形 num = 0;而%的意思大家都应该已经明白了,就是取模的意思。

然后使用scanf 函数进行接受用户输入的数字,接下来便到了最重要的环节。

我们假如输入一个数字 5 

程序运行口述:

被 2 % (取模)后是否 == (等于)1

如果等于1的话,则语句继续往下执行。

输出 的结果就是 :5 是 奇数

如果被 2 % (取模)后是否 == (不等于)1

则输出空白内容。

简单来说,if 就是来判断的,

如果xxxx就xxxxx

如果不xxxx就xxxxx

2、else 

        如果⼀个数不是奇数,那就是偶数了,如果任意⼀个整数,我们要清楚的判断是奇数还是偶数怎么表⽰呢?
        这⾥就需要 if...else... 语句了,
        语法形式如下:
if ( 表达式 )
 语句1
else
 语句2

        例子:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印数偶数。

        有了刚才的经验,我们可以更简单的理解为:
        如果程序某条语句条件成立,就执行某条语句
        如果程序某条语句条件不成立,就执行另一条语句
        上代码!

 

#include <stdio.h>
int main()
{
 int num = 0; //定义一个整型变量,存放用户输入的数字

 scanf("%d", &num);//接收用户输入的数字

 if(num % 2 == 1)//某个数字模上2等于1,就执行if下面的语句,否则执行另一条语句

 printf("%d 是奇数\n", num);

 else//如果某个数字模上2不等于1,就从这里进入另一个分支,执行下面一条语句

 printf("%d 是偶数\n", num);
 return 0;
}

 代码的每一句的意思我都标注上去了,大家可以看一看。

接下来,学会了上面的案例,我们再来一个例子:

输⼊⼀个年龄,>= 18岁就输出:成年,否则就输出:未成年
首先先来理一下思路,两个分支就足够了。
用户输入一个数字,如果大于或者等于十八岁就输出成年
在C语言可以这样表示大于等于18:( 》=18)
否则的话就输出未成年。
这样的话,直接一个else 加上printf 输出就好了。
上代码!
#include <stdio.h>
int main()
{
 int age = 0;//定义整形

 scanf("%d", &age);//接受用户输入的数字

 if(age>=18)//如果age大于等于18,就执行下一条语句

 printf("成年\n");

 else//如果age没有大于等于18,就执行else下面的语句

 printf("未成年\n");

 return 0;
}
这个例子和上面的那个是否为素数的轮廓差不多。
接下来我们来看:
3、 分⽀中包含多条语句
默认在 if else 语句中默认都只控制⼀条语句
⽐如这个代码就是错误的:

上⾯的代码,
你输出之后会发现输⼊的值不管是>=18 还是⼩于18,
"可以谈恋爱了" 都会打印在屏幕上。

这是因为 if 语句只能控制⼀条语句,就是 printf("成年了\n");
if语句为真,则打印成年了, if语句为假,则不打印
 
对于 printf("可以谈恋爱了\n");
是独⽴存在的,不管if语句的条件的真假,
都会被执⾏。那如果我们要if语句同时控制2条语句,怎么办呢?
那就要使⽤ {} 将代码括起来, else 后也可以跟上⼤括号。

上代码!

#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
 if(age >= 18) //if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
 {
 printf("成年了\n");
 printf("可以交⼥朋友了\n");
 }
 else //else 后使⽤{}控制多条语句-这个块也叫:程序块,或者复合语句
 {
 printf("未成年\n");
 printf("不可以早恋哦\n");
 }
 return 0;
}

这样的话,程序代码才是正确的,都可以完全执行起来。

4、嵌套 if

if else 语句中, else 可以与另⼀个 if 语句连⽤,构成多重判断。
⽐如:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数。
请看如下代码:

        上图中淡蓝色背景的代码就是嵌套在前⾯的 else ⼦句中的,构成了嵌套的if语句。

5、悬空else问题

如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。
例如这一段代码:
输入的结果是多少呢?

输出的结果是 空白

为什么呢?
这就是悬空 else 的问题,如果有多个 if else ,可以记住这样⼀条规则, else 总是跟最接近
if 匹配。
上⾯的代码排版,让 else 和第⼀个 if 语句对⻬,让我们以为 else 是和第⼀个if匹配的,当 if
语句不成⽴的时候,⾃然想到的就是执⾏ else ⼦句,打印 haha
但实际上 else 是和第⼆个 if 进⾏匹配的,这样后边的 if...else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不 成⽴,嵌套 if 和 else 就没机会执⾏了,最终啥都不打印。
如果代码改成下⾯这样就更加容易理解了

        只要带上适当的⼤括号,代码的逻辑就会更加的清晰,所以⼤家以后在写代码的时候要注意括号的使用,让代码的可读性更高。
        
6、关系操作符
 
C 语⾔⽤于⽐较的表达式,称为 “关系表达式”(relational expression)
⾥⾯使⽤的运算符就称为“关系运算符”(relational operator),主要有下⾯6个。
> ⼤于运算符
< ⼩于运算符
!= 不相等运算符
== 相等运算符
<= ⼩于等于运算符
>= 大于等于运算符
a == b;
a != b;
a < b;
a > b;
a <= b;
a >= b;
关系表达式通常返回 0 1 ,表⽰真假。
C 语⾔中, 0 表⽰假,所有⾮零值表⽰真。
⽐如, 20 > 12 返回 1 12 > 20 返回 0
关系表达式常⽤于 if while 结构。
例如:
if (x == 3) {
 printf("x is 3.\n");
}

//注意:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。
//有时候,可能会不⼩⼼写出下⾯的代码,它可以运⾏,但很容易出现意料之外的结果。
if (x = 3) ...
上⾯⽰例中,原意是 x == 3 ,但是不⼩⼼写成 x = 3
这个式⼦表⽰对变量 x 赋值 3 ,它的返 回值为 3 ,所以 if 判断总是为真。
为了防⽌出现这种错误,有的程序员喜欢将变量写在等号的右边。
if ( 3 == x) ...
这样的话,如果把 == 误写成 = ,编译器就会报错。
/* 报错 */
if ( 3 = x) ...
//推荐写法

7、条件操作符

条件操作符也叫三⽬操作符,需要接受三个操作数的,形式如下:
exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算
计算的结果是整个表达式的结果;
如果 exp1 为假, exp3 计算,计算的结果是整个表达式的结果。

练习2:使⽤条件表达式实现找两个数中较⼤值。 

#include <stdio.h>
int main()
{
 int a = 0;

 int b = 0;

 scanf("%d %d", &a, &b);

 int m = a>b ? a : b;//这句话的意思就是,如果a>b,就取a,如果a不大于b,就直接取b的值

 printf("%d\n", m);

 
 return 0;
}

8、逻辑操作符:逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。

&&(与运算符)

与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。

 ||(或运算符) 

或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。

!(逻辑取反运算符)

逻辑取反运算符(改变单个表达式的真假)。
注:C语⾔中,⾮0表⽰真,0表⽰假

首先来看 !(逻辑取反运算符)

⽐如,我们有⼀个变量叫 flag ,如果flag为假,要做⼀个什么事情,就可以这样写代码:
#include <stdio.h>
int main()

{

 int flag = 0;//首先来看,在C语言中0为假,所以这个程序是不执行的

 if(!flag)//但是!flag 之后,就是把上一句的假变为真,程序正常执行

 {

 printf("do something\n");

 }

 return 0;
}
如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真
所以上⾯的代码的意思就是 flag 为假,执⾏if语句中的代码。

        简单来说,! 的意思就是跟你反着来。

        &&(与运算符)

&& 就是与运算符,也是并且的意思, && 是⼀个双⽬操作符,使⽤的⽅式是 a&&b
&& 两边的表达 式都是真的时候,整个表达式才为真
只要有⼀个是假,则整个表达式为假。
⽐如:如果我们说⽉份是3⽉到5⽉,是春天,那使⽤代码怎么体现呢?
int month = 0;

scanf("%d", &month);

if(month >= 3 && month <= 5)//这⾥表达的意思就是month既要⼤于等于3
                            //⼜要⼩于等于5,必须同时满⾜。
{

printf("春季\n");

}

        ||(或运算符) 

|| 就是或运算符,也就是或者的意思
 || 也是⼀个双⽬操作符,使⽤的⽅式是 a || b
 || 两边的表达式只要有⼀个是真,整个表达式就是真
两边的表达式都为假的时候,才为假。
⽐如:我们说⼀年中⽉份是12⽉或者1⽉或者2⽉是冬天,那么我们怎么使⽤代码体现呢?
int month = 0;

scanf("%d", &month);

if(month == 12 || month==1 || month == 2)

{

 printf("冬季\n");

}

可以理解为 只要用户输入了其中一个代表冬季的月份就可以输出冬季了

9、短路

C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,
再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。
这种情况称为“短路”。
如前⾯的代码:
if  (month >= 3 && month <= 5 )
表达式中&& 的左操作数是 month >= 3
右操作数是 month <= 5
当左操作数 month >= 3 的结果是0的时候
即使不判断 month <= 5 
整个表达式的结果也是0(不是春季)。
所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏。
对于 || 操作符是怎么样呢?
我们结合前⾯的代码:
if (month == 12 || month== 1 || month == 2)
如果month == 12
则不⽤再判断month是否等于1或者2
整个表达式的结果也是1(是冬季)
所以, || 操作符的左操作数的结果不为0时
就⽆需执⾏右操作数。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果
不再对右操作数进⾏计算的运算称为短路求值。
阅读代码,计算代码输出的结果 :
#include <stdio.h>

int main()

{

 int i = 0,a=0,b=2,c =3,d=4;

 i = a++ && ++b && d++;

 //i = a++||++b||d++;

 printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);

 return 0;
}

答案是:1 2 3 4 

答对了吗?

思路:首先来看,a++,因为a++是后置++,后置++是先使用再++。

因为在程序执行的时候,a++ 后面的 && 已经使用过了,认为 i = 0,所以后面的就不在执行了。

就像我们前面所说的那样

对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏。

接下来我们看 另一种情况:
#include <stdio.h>
int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	//i = a++ && ++b && d++;
	i = a++||++b||d++;
	printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
	return 0;
}

思路:因为我们前面说道 || 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数。

现在a= 0,所以继续执行,到了++b这里,b就等于3,所以d++就不用算了。

所以答案就是1 3 3 4

10、switch 语句
除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。
switch 语句是⼀种特殊形式的 if...else 结构,⽤于判断条件有多个结果的情况。
它把多重 的 else if 改成更易⽤、可读性更好的形式。
switch (expression) 
{
 case value1: statement

 case value2: statement

 default: statement
}
上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。
如果找不到对应的值, 就执⾏ default 分⽀。
特别注意!!!
switch 后的 expression 必须是整型表达式
case 后的值,必须是整形常量表达式

11、switch 中的break

我们发现,7除以3本来余数是1
但是我们发现程序运⾏的结果多了⼀⾏“余数是2”的打印。
这是为什么呢?
原因是 switch 语句也是分⽀效果的
只有在 switch 语句中使⽤ break 才能在跳出 switch 语句
如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执⾏
有可能执⾏其他 case
语句中的代码,直到遇到 break 语句或者 switch 语句结束
就⽐如上⾯的代码就执⾏了 case 2 中的语句
所以在 switch 语句中 break 语句是⾮常重要的,能实现真正的分⽀效果。
当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。

12、switch语句中的default

在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况
⽐如 switch 后的表达式中的值⽆法匹 配代码中的 case 语句的时候
这时候要不就不做处理,要不就得在 switch 语句中加⼊ default ⼦句。
switch (expression) 
{
 case value1: statement

 case value2: statement

 default: statement
}
switch 后边的 expression 的结果不是 value1
也不是 value2 的时候,就会执⾏ default ⼦句
switch语句中的case和default的顺序问题
switch 语句中 case ⼦句和 default ⼦句有要求顺序吗? default 只能放在最后吗?
其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实
际需求的就可以。
不过我们通常是把 default ⼦句放在最后处理的。
感谢大家阅读!
结合网络资料和自身学习的状况总结出来的这些东西
如果对你有帮助的话,记得点赞收藏起来!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值