C语言中的选择分支

1、分支
1、if语句
(1)if(表达式)
{语句;}
当表达式为真时,执行语句,为假时则不执行。
(2)if(表达式)
{语句1};
else:
{语句2};
当表达式为真时,执行语句1,当表达式为假时,执行语句2。
(3)if分支的嵌套
①if(表达式1)
{
if(表达式2)
{语句1};
else:
{语句2};
}
else:
{语句3};
上述是在if语句中再嵌套一个if...else....语句。当表达式1为真时,执行里面的if...else....(即大括号里的内容),再次判断表达式2
是否为真,如果表达式2为真时,则执行语句1,否则执行语句2。而当表达式1为假时,则执行后面else中的语句3.同样,else语句也可以进行嵌套。
②if(表达式1)
{语句1};
else:
{
if(表达式2)
{语句2};
else:
{语句3};
}
}
上述程序则是在else语句中再嵌套一个if...else....语句,所以首先先要判断表达式1是否为真,如果为真则执行语句1,如果为假则执行else语句,而 else语句中是是一个if...else....,所以需要判断表达式2是否为真,如果为真则执行语句2,反之则执行语句3.
上述if分支需要注意:
(1)if和else后面如果跟着多条语句,而且想要被其控制,则需要加入大括号将语句全部阔进去。
解释:

if(age<=18)
printf("未成年\n");
else:
printf("成年\n");
如果表达式为真则执行输出未成年,否则执行输出成年;

if(age<=18)
printf("未成年\n");
else:
printf("成年\n");
printf("可以谈恋爱了\n");
此时运行程序就会出现问题,当输入年龄大于18岁时,打印成年和可以谈恋爱了两句话。但当我们输入的年龄小于等于18时,你会发现他还是会打印两句话,分别是未成年和可以谈恋爱了。这不是我们想要的,因为,当输入小于等于18的数值我们只想让其输出的是未成年,此时应该怎么做?需要将else里面的两条语句用大括号括起来,就可以解决这个问题。
if(age<=18)
printf("未成年\n");
else:
{
printf("成年\n");
printf("可以谈恋爱了\n");
}
(2)else会匹配最近的if
解释:

int a=0;
int b=2;
if(a1)
if(b
2)
printf("haha\n");
else:
printf("hehe\n");
上面这个程序会打印什么?当然是什么都不打印,有的人以为会打印hehe出来,殊不知这个程序什么都不会打印,这是为什么?由于else会匹配最近的if所以这里的else匹配的是 if(b2)这个if,而不是这个if(a1),所以a=0时if(a1)就是假的,那么直接就不执行所有语句了,可能有些人还是看不出来为什么,我们直接调整成正确的代码格式。
int a=0;
int b=2;
if(a
1)
if(b2)
printf("haha\n");
else:
printf("hehe\n");
这个时候结构是不是比较明显了,所以错误的代码书写习惯会带来很多不必要的勿扰,为了减少这些问题,可以采用打括号的方式:
int a=0;
int b=2;
if(a
1)
{
if(b==2)
printf("haha\n");
else:
printf("hehe\n");
}
2、switch语句
switch(表达式)
{
case value1:statment1;
case value2:statment2;
case value3:statment3;
.
.
.
case valuen:statmentn;
default:statment;
}
先来解释一下里面涉及的这边名称:
switch(表达式)中的表达式为多种值,且表达式和结果必须是整型的。
value1,value2....,必须是整型变量,当满足某个value则执行他后面对应的语句statment。
default为当上面所有的case都不匹配则执行它。
对于switch语句它属于多分支语句,使用他时有几个注意事项:
(1)case与后面的value变量中间是要有空格的
(2)每一个case执行完都需要在语句后面加break
解释:
switch(day)
{
case 1:printf("星期一");
case 2:printf("星期二");
case 3:printf("星期三");
case 4:printf("星期四");
case 5:printf("星期五");
case 6:printf("星期六");
case 7:printf("星期日");
default:printf("重新输入1-7");
}
如果后面没有break,执行上述代码时,当day=1时,本来直想让其打印星期一的,由于没有break,那么执行完case 1之后继续往下执行,此时它会将后面的所有星期都给打印出来,直到最后一句话执行完。所以为了得到正确答案,上述程序改为:
switch(day)
{
case 1:printf("星期一");break;
case 2:printf("星期二");break;
case 3:printf("星期三");break;
case 4:printf("星期四");break;
case 5:printf("星期五");break;
case 6:printf("星期六");break;
case 7:printf("星期日");break;
default:printf("重新输入1-7");
}
即每一个语句后面都有一个break,当day=1时他会执行对应的星期一之后遇到break跳出来。
(3)switch(表达式)没有顺序要求
解释:
switch(day)
{
case 1:printf("星期一");break;
case 2:printf("星期二");break;
case 3:printf("星期三");break;
case 4:printf("星期四");break;
case 5:printf("星期五");break;
case 6:printf("星期六");break;
case 7:printf("星期日");break;
default:printf("重新输入1-7");
}
switch(day)
{
case 1:printf("星期一");break;
case 2:printf("星期二");break;
case 3:printf("星期三");break;
case 7:printf("星期日");break;
default:printf("重新输入1-7");
case 4:printf("星期四");break;
case 5:printf("星期五");break;
case 6:printf("星期六");break;
}
上面两个程序,语句的顺序不一样,但是执行的结果是一样的。
(4)case后不一定有break.
解释:
当好几个case所执行的语句是同一个内容时,break可以省略,如:
switch(day)
{
case 1:printf("星期一");printf("工作日");break;
case 2:printf("星期二");printf("工作日");break;
case 3:printf("星期三");printf("工作日");break;
case 4:printf("星期四");printf("工作日");break;
case 5:printf("星期五");printf("工作日");break;
case 6:printf("星期六");printf("非工作日");break;
case 7:printf("星期日");printf("非工作日");break;
default:printf("重新输入1-7");
}
此时你会发现星期一到星期五都是工作日,所以没必要都写一个printf("工作日");break;,此时代码可以做以下改进:
switch(day)
{
case 1:printf("星期一");
case 2:printf("星期二");
case 3:printf("星期三");
case 4:printf("星期四");
case 5:printf("星期五");printf("工作日");break;
case 6:printf("星期六");
case 7:printf("星期日");printf("非工作日");break;
default:printf("重新输入1-7");
}
两个程序打印的效果完全一样。这里就是想告诉大家,break不是必须有的。

最后,写的不好也有可能写错,作为初学者,欢迎大家指正,希望共同进步。

posted @ 2026-04-14 22:12  MNoah  阅读(6)  评论(0)    收藏  举报