引言
在C语言里分支结构又称为选择结构,就像生活里常见的选择,比如我就今天中午选择去吃猪脚饭,还是螺蛳粉,或是多分支选择,我今天中午选择去吃猪脚饭,螺蛳粉,快餐饭,水饺。
这就对应了我们在C语言里的两种最常见的分支语句分别是if和switch语句。
1.if语句
1.1if语句的结构写法:
if(条件判断)//为真执行
{
执行语句
}
else//当if后面的条件判断为假就会直接执行
{
执行语句
}
我们都知道在C语言里,非0为代表真,0代表假,当关系表达式为真时就会执行。
实例1:
#include <stdio.h>
int main()
{
int n = 2;
int m = 3;
if (m > n)
printf("%d\n", m);
return 0;
}
这里m>n编译器进行判断后结果为真,执行了if语句,打印3,若判断结果为假就会结束if语句,什么也不会打印。
例子2:
int main()
{
int n = 2;
int m = 3;
if (m < n)
printf("%d\n", m);
else
printf("%d\n", m);
return 0;
}
这个实例2就演示了,条件判断为假后执行else语句,当我们使用if语句时,一个if就可以完成我所期待的事,那else就可以省略。
在if语句里,if和else总是与它最近的语句相匹配,如果一个if里需要多条执行语句,那就需要使用花括号( {} ),来框在一起。
实例3:
int main()
{
int m = 0;
int n = 0;
scanf("%d %d", &m, &n);
if (m % n == 0)
{
m = m + n;
printf("%d\n", m);
}
else
{
n = m + n;
printf("%d\n", n);
}
return 0;
}
如果在实例3里不加入花括号,那么实例3里均不会执行printf语句。
1.2if语句的嵌套
if语句是可以层层叠加,以方便于我们进行更复杂的逻辑判断。
这是第一种if语句嵌套方法。
int main()
{
int noodle = 20;//螺蛳粉
int snack = 10;//零食
int rice = 25;//猪脚饭
int ox = 18;//牛肉干
int money = 0;
scanf_s("%d", &money);//我现在有对少钱
if (money > 25)
{
printf("我现在好饿想把50快都拿去吃好吃的\n");
money = money - 20;
if (money > 25)
{
money = money - rice;
printf("我又吃了一份我超喜欢的猪脚饭!!!\n");
}
else
{
printf("我的钱好像不够吃饭了,那我再买一点小零食\n");
money = money - snack;
printf("我还有%d块钱\n", money);
}
}
else
{
printf("我现在的钱好像不够!还是去买点零食吧");
}
return 0;
}
这是第二种if语句嵌套方法
int main()
{
int noodle = 20;//螺蛳粉
int snack = 10;//零食
int rice = 25;//猪脚饭
int ox = 18;//牛肉干
int money = 0;
scanf_s("%d", &money);//我现在有对少钱
if (money == 50)
{
printf("我现在好饿想把50快都拿去吃好吃的\n");
money = money - noodle;
}
else if (money > 30)
{
printf("我现在好饿想把50快都拿去吃好吃的\n");
money = money - rice;
}
else
{
printf("我现在的钱好像不够!还是去买点零食吧\n");
money = money - ox;
}
printf("我还有%d块钱", money);
ret
在使用上我更推荐使用第二种嵌套方法,其优点:可读性高,更加简洁。
其逻辑可以理解为
1.3else悬空问题
else悬空问题:是指else没有与任何一个if或者else if进行匹配。
int main()
{
int a = 10;
int b = 8;
if (a < b)
if (a > b)
printf("a大于b\n");
else
printf("你猜会打印我还是上一个printf函数\n");
return 0;
}
判断一下这窜代码运行后会打印什么内容?
事实上这窜代码的运行结果是空的,什么也不会打印,这就是else悬空问题。为什么会这样呢?if语句里的else总是与它最近的if相匹配。正确写法是这样。
int main()
{
int a = 10;
int b = 8;
if (a < b)
{
if (a > b)
printf("a大于b\n");
else
printf("你猜会打印我还是上一个printf函数\n");
}
return 0;
}
这样就很明了,运行代码后a是大于b的第一个if就没有执行,所以不会进入嵌套的if语句,执行代码后,什么也不会打印。
2.switch语句
switch语句与if语句类似,但是它可以进行更多的选择判断,这是它的结构。
switch(整形表达式)
{
case 整形常量表达式:
句子;
break;
case 整形常量表达式:
句子;
break;
default:
句子;
break;
}
switch里case 对应的整形常量表达式,为switch()里的整形表达式,整形表达式的值对应case 的表达式,如果没有相匹配的case 就会执行default。
2.1switch里的case和break
在switch语句,里我们必须在每个case与数字之间加上个整形。
在switch语句里,如果我们加上break或者去除会产生什么样的效果?
#include <stdio.h>
int main()
{
int input = 0;
printf("随机输入1到3的数字,来选出自己等会去做什么?\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("我可以去吃零食了!\n");
break;
case 2:
printf("我现在还不是娱乐的时候,乖乖去敲代码吧~\n");
break;
case 3:
printf("我终于可与去休息了!\n");
break;
default:
printf("我现在好像有些迷糊,是1到3的数字。\n");
break;
}
return 0;
}
如果在这里将所有break去除,在switch里将会执行input对应case以下的所有代码。
这是为什么呢? 原因是 switch 语句也是分⽀效果的,只有在switch语句里使用break才能跳出switch,如果某一个case语句后面没有加上break,那执行完这条case语句后不会停止,跳出switch,还会接着执行下一条case语句,直到遇见break后才会停止,所以break在switch里是非常难重要的。但这并不代表每一条case语句后都需要跟上一个braek,这需要更具实际情况来进行选择。
2.2switch里的default
default在switch里用于处理,switch()里的整形表达式与每一个case后的整形常量不相匹配的情况,如果switch()里整形常量表达式的没有与之对应的case的整形常量,那就会执行default语句。
这是执行上述代码后的输入4或其它常量的结果。
2.3switch语句里case与default的顺序
在switch语句里case与default的顺序并不是绝对的,而是可以随意组合的,default放在case里的任意位置,case不跟据它后面的常来进行排序也是可行的。
但不过,为了满足正常的逻辑表达,才会按照正常逻辑来排序,的default通常是放在句末的位置。
int main()
{
int input = 0;
printf("随机输入1到3的数字,来选出自己等会去做什么?\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("我可以去吃零食了!\n");
break;
case 3:
printf("我现在还不是娱乐的时候,乖乖去敲代码吧~\n");
break;
default:
printf("我现在好像有些迷糊,是输入1到3的数字。\n");
break;
case 2:
printf("我终于可与去休息了!\n");
break;
}
return 0;
}