目录
选择结构
什么是语句
C语言中由一个分号;相隔的就是一条语句
分支语句(选择结构)
如果你好好学习,校招时拿一个好offer,走上人生巅峰。
如果你不学习,毕业等于失业,回家卖红薯。
这就是选择!
if 语句
语法结构:
1 if(表达式)
语句;
2 if(表达式)
语句1;
else
语句2;
3//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
如果没有花括号来括住选择后的语句,那么只能默认选择语句后的第一条语句是这个选择内的语句
#include<stdio.h> int main() { int age = 20; /*if (age >= 18) printf("成年\n");*/ if (age >= 18) printf("成年\n"); else printf("未成年\n"); printf("不能谈恋爱"); //输出为20 成年 不能谈恋爱 int age1 = 10; if (age1 >= 18) printf("成年\n"); else { printf("未成年\n"); printf("不能谈恋爱"); } //输出为成年 return 0; }
#include<stdio.h> int main() { int age = 10; if (age < 18) printf("少年\n"); else if (age >= 18 && age < 26) printf("青年\n"); else if (age >= 26 && age < 40) printf("中年\n"); else if (age >= 40 && age < 60) printf("壮年\n"); else if (age >= 60 && age < 100) printf("老年\n"); else printf("老不死\n"); //少年 return 0; }
解释一下:
如果表达式的结果为真,则语句执行。
在C语言中如何表示真假?
0表示假,非0表示真。
悬空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; }
else的匹配:else是和它离的最近的if匹配的。
因为else是和第二个if匹配,所以都进不去第一个if的语句
所以代码的风格非常重要,需要将对应的选择结构分隔
#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; }
//代码1 if (condition) { return x; } return y; //代码2 if(condition) { return x; } else { return y; }
虽然代码一和代码二的功能是一模一样的但是明显代码二比较好比较直观
return 语句,返回一个值,如然后结束这个函数
//代码3 int num = 1; if(num == 5) { printf("hehe\n"); } //代码4 int num = 1; if(5 == num) { printf("hehe\n"); }
代码4更好,因为如果写成5=num,那么轻易发现错误;
switch 语句
Switch适用于多分支的情况
语句项
是一个整型表达式
#include<stdio.h> int main() { int day = 0; scanf("%d", &day); switch (day) { 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"); } /*输入1的话, 会输出 星期一 星期二 星期三 星期四 星期五 星期六 星期日 */ switch (day) { 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; } /*输入1的话 输出是星期一 */ int day = 0; switch(day) { case 1: case 2: case 3: case 4: case 5: printf("weekday\n"); break; case 6: case 7: printf("weekend\n"); break; default: printf("输出错误\n"); break; } }//break语句 的实际效果是把语句列表划分为不同的分支部分。 return 0; }
这个case整形表达式决定了入口,就是从什么地方开始输出
break决定了这个结构的出口
default 字句
如果表达的值与所有的case标签的值都不匹配怎么办?
其实也没什么,结构就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条default子句,把下面的标签
default:
写在任何一个 case 标签可以出现的位置。
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。