分支语句(选择结构)
if语句
if语句有单分支:
if()
;
双分支:
if()
;
else
;
多分支:
if()
;
else if()
;
else
;
在语法结构if()后面的括号里的表达式为真的时候,再执行下面的语句,否则不执行,else if 同理。c语言中如何表达真假:0表示假,非0为真。
我们来实现一个代码:18以下是少年 18——30 青年 30——50 中年 50——80 老年 80以上 老寿星:
int main()
{
// 实现18以下是少年
//18——30 青年 30——50 中年 50——80 老年 80以上 老寿星
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("少年");
}
else if(age >= 18 && age < 30)
{
printf("青年");
}
else if (age >= 30 && age <50)
{
printf("中年");
}
else if (age >=50 && age < 80)
{
printf("老年");
}
else
{
printf("老寿星");
}
}
在C语言中不能写
18 <= age <= 30
这样的形式,这样是无法实现的,编译器会先判断18 <= age ,再判断 age <= 30。
其实这段代码还可以再简洁一点:
if (age < 18)
{
printf("shaonian");
}
else if ( age < 30)
{
printf("qingnian");
}
else if ( age < 50)
{
printf("zhonnian");
}
else if ( age < 80)
{
printf("laonian");
}
else
{
printf("laosx");
}
我们看一个代码,if语句中最容易错的地方;
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
{
printf("haha\n");
}
他会输出什么?事实是什么都没有输出,为什么?因为这里的else不是与第一个if匹配的,故意写成这样迷惑,其实else只与最近的if匹配。所以代码风格很重要。
switch语句
我们试着输入1:输出星期一,输入2:星期二,输入3:星期三......。这样的代码,如果用if else 语句太复杂,所以我们就可以用新的形式:switch语句。
int main()
{
int num = 0;
scanf("%d", &num);
switch (num)
{
case 1:
printf("星期1\n");
break;// break 很重要 只有了break 才是真正的分支,不然输入几就会一直输出下去
case 2:
printf("星期2\n");
break;
case 3:
printf("星期3\n");
break;
case 4:
printf("星期4\n");
break;
case 5:
printf("星期5\n");
break;
case 6:
printf("星期6\n");
break;
case 7:
printf("星期7\n");
break;
default://可以在任何地方,没有case就输出她
printf("没有");
break;
}
switch语句的形式为:switch(整形表达式 ) ,括号里必须是整形表达式。case 后面必须是整型常量表达式。
在switch语句中 break相当重要,如果没有break,switch语句就会从入口进入然后一直执行下去,不会实现分支结构。例如:我们把上述代码的 break 语句注释掉,,看看结果:
int num = 0;
scanf("%d", &num);
switch (num)
{
case 1:
printf("星期1\n");
//break;// break 很重要 只有了break 才是真正的分支,不然输入几就会一直输出下去
case 2:
printf("星期2\n");
//break;
case 3:
printf("星期3\n");
//break;
case 4:
printf("星期4\n");
//break;
case 5:
printf("星期5\n");
//break;
case 6:
printf("星期6\n");
//break;
case 7:
printf("星期7\n");
//break;
default://可以在任何地方,没有case就输出她
printf("没有");
//break;
}
我们输入1,就从case 1 入口进入,然后执行下面的所有代码。如果输入2或者3呢:
就会从2 或 3 的入口进入然后执行下面的代码。这样完全不能实现我们的想法,所以break 是十分重要的,但是有时候我们也可以用来实现其他效果,例如我们想要星期一到星期五输出 weekday,星期六到星期日输出 weekend:
//如果我想1——5输出工作日 6 7 输出休息日
int num = 0;
scanf("%d", &num);
switch (num)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("休息日");
break;
default:
break;
}
break语句 的实际效果是把语句列表分为不同的分支部分。
在switch语句中还有一个default子句也是重要的,当所有的case 语句的值都不符合的时候,就会输出default子句的内容。他可以在语句列表的任何位置,且只有一个。
这里也有一个练习:
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{//switch 可以嵌套
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d,n = %d\n", m, n);
可以自己试试。
答案:m = 5,n = 3。