1.分支语句( 选择结构 )
人生处处面临选择 ,好好努力学习将来将会拿到一个好offer,否则如果家里有矿回家继承家产,否则毕业回家卖红薯;
在C语言中,分支语句有两种: if 和 switch 。
1.1if 分支语法
(1)单分支
if( 表达式)
{
语句;
}
(2)多分支
if ( 表达式1 )
{
语句1;
}
else if( 表达式2 )
{
语句2;
}
else
{
语句3;
}
代码演示:
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >0)
{
if (age >= 18 && age <= 35)
{
printf("青年!\n");
}
else if (age < 18)
{
printf("未成年!\n");
}
else if (age > 35 && age <= 55)
{
printf("中年!\n");
}
else
{
printf("老年!\n");
}
}
else
{
printf("输入年龄有误!!!\n");
}
return 0;
}
代码解释以及运行结果:
注意的是:if 中的表达式在C语言中 0 表示假,非 0 表示真 !而且,if 条件成立,执行的是 if 下面的一对花括号中的内容(代码块);
1.2悬空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;
}
我猜您的答案是:haha !
OK,我们一起来看看结果:
啊!!!,居然什么都没有打印!why? 不要把慌,我们 一起来分析一下:
改正风格后的代码为:
#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;
}
建议:写的代码的时候不要嫌麻烦,加上{ }这样代码的可读性会更高!并且出问题时也很快会找到问题所在!还有就是有时候if(a == 1)容易写成 if (a = 1) 这样就是赋值了,建议写成:if (1 == a )这样即使写错,编译器也不会赋值,且容易找到错误!
OK,举个例子练习一下:
#include <stdio.h>
//输入一个数判断是否是奇数
int main()
{
int a = 0;
scanf("%d", &a);
if (a % 2 == 1)
{
printf("%d\n", a);
}
else
{
printf("不是奇数");
}
return 0;
}
2.switch语句
switch 也是一种分支结构 常常用于多分支的情况!若果if else ....if else...过多时,选择用switch!
switch语法
switch ( 整型表达式 )
{
语句项;
}
这里的语句项是:一些 case 语句;------> case 整型表达式 : 语句 ;
举个栗子(输入几输出相应的星期几):
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n)
{
if (n >= 1 && n <= 7)
{
case 1:
printf("周一\n");
case 2:
printf("周二\n");
case 3:
printf("周三\n");
case 4:
printf("周四\n");
case 5:
printf("周五\n");
case 6:
printf("周六\n");
case 7:
printf("周天\n");
}
else
{
printf("输入无效数据!\n");
}
}
return 0;
}
是否正确呢?我们分别用3 和 5来测试一下,是否会输出周三和周五?
唉,这里的结果好像和我们的期待的结果好像不一样啊!为什么呢?
这里就不得不说一下break 这个关键字了!break即结束;也就是说我们上面输入一个数输出相应的周几后应该停止(结束)而不是继续执行!
那我们我代码修改后如下:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n)
{
if (n >= 1 && n <= 7)
{
case 1:
printf("周一\n"); break;
case 2:
printf("周二\n"); break;
case 3:
printf("周三\n"); break;
case 4:
printf("周四\n"); break;
case 5:
printf("周五\n"); break;
case 6:
printf("周六\n"); break;
case 7:
printf("周天\n"); break;
}
else
{
printf("输入无效数据!\n");
}
}
return 0;
}
我们再来看看结果:
现在符合要求了!但观察上面代码会发现一开始保证输入的有效数据是用了if else 这样貌似有点 麻烦有没有好一点的解决方案呢?这里就调到到了switch 中的空一个关键字:default 默认的;当数据不符合case 中的每一个是就会走默认;
上面代码优化:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n)
{
case 1:
printf("周一\n"); break;
case 2:
printf("周二\n"); break;
case 3:
printf("周三\n"); break;
case 4:
printf("周四\n"); break;
case 5:
printf("周五\n"); break;
case 6:
printf("周六\n"); break;
case 7:
printf("周天\n"); break;
default: printf("输入数据无效!!!\n");
}
return 0;
}
运行结果:
多次测试无bug !
注意:default不加时,当匹配不到相应的case标签时就会自动跳过,也不会报错!如果你不想忽略不能与case匹配的标签时,就可以加上! 另外,case 和 default的位置可以随的没有强制的要求!!!上面栗子告诉我们要养成好的编程习惯在非必要场合下都加上break!
并且 当case 后面遇到 break 时才会停止!
代码演示(输入1----5 上课, 6- 7 休息):
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("上课\n");
break;
case 6:
case 7:
printf("休息\n");
break;
default: printf("数据输入有效!\n");
}
return 0;
}
选择结构是可以嵌套的!例如一开始保证数据有效的switch中的if else,下面我们再来看一个栗子(switch嵌套switch):
代码演示:
#include <stdio.h>
int main()
{
int m = 1;
int n = 2;
switch (m)
{
case 1 :
m++;
case 2 :
switch (m)
{
case 1 :
n--;
case 2 :
m++;
n++;
break;
}
case 3 :
m--;
break;
default: break;
}
printf("n = %d m = %d", n, m);
return 0;
}
运行结果和代码解释:
这就是switch嵌套的典型栗子!!!