示例代码的第一段是 if 语句的用法,第二段是 switch 语句的用法。
if语句
if语句有三种形态:if、if…else、if…else if…else。三种形态各有着不同的应用场景
if(表达式){
表达式成立语句体;
} else {
表达式不成立语句体;
}
评价:标标准准的分支语句,二选其一。成立执行 表达式成立语句体;不成立执行 表达式不成立语句体。
if(表达式1){
语句体1;
} else if(表达式2){
语句体2;
} else if(表达式3){
语句体3;
} ... else {
表达式均不成立执行的语句体;
}
评价:多分支语句,可以对多个给出的条件进行判断
if(表达式){
语句体1;
}
语句体2;
特意将 if单语句体 放在这里是因为单语句体的一个用处。
一般情况下,如果if中有return语句,语句体2不一定执行;但如果没有return语句,语句体2一定执行。
因为这一点:
void func(){
if(1){
...
return;
}
// 因为if条件成立后边的 a、b、c均不会被执行。
a ;
b ;
...
}
以及 if 中不包含 return 时,语句2一定会被执行。
// a为负数 a = a + 20, a 为正数 a = a + 10.
if(a < 0){
a = a + 10;
}
a = a + 10;
评价:简单之中,蕴含巨大能量。
switch语句
由switch语句的结构片段很容易就看出来 switch语句 的用法。
switch(整型表达式){
case value1 :
语句1;
break;
case value2 :
语句2;
break;
...
default:
语句;
case extern1 :
语句e1;
break;
}
这里我们主要说的就是几个点:
- switch 后面跟的是整型表达式, 这个整型不单单是我在数据类型中归为整型的short、int等,任意和整型的数据储存格式相同的(计算机底层按照整型存储的)类型,如:char、bool、以及枚举类型都可以作为switc中表达式的类型。
- switch语句中有 case 和 default,case 后边必须跟一个表达式所允许的取值,default 和 else 的作用一样,都表示所有的语句入口均不符合要求时进入的分支。switch 和 else 均可以省略,表达的意思是所有的语句入口均不符合要求时不做处理。
- case 和 default 的位置不做要求。这是因为 break 的作用就是跳出 switch 的分支结构。case 后面跟着 break 当进入 case 对应的分支之后语句执行完成,遇到 break 就跳出了 switch 语句(switch语句执行完成)。也由此 default 后面 break 也不写都一样(default放在哪都是最后一个入口)。
- 基于 break 的作用。如果省略 break,switch 分支视自己没有执行结束,它会继续向下一个分支前进。这时 case 语句的先后顺序决定了语句的执行顺序,又称switch的穿透。比如,我计算给出的一天是当年的哪一天,我就可以使用 switch 的穿透作用,将这个月之前的所有天数进行求和。
示例代码
#include <stdio.h>
enum e_age {
AGE1 = 18,
AGE2 = 30,
AGE3 = 40,
AGE4 = 60
};
int main(int argc, char const *argv[]) {
int age = 10;
if(age < 0){
return -1; //如果age < 0,成立,那么后面的代码就都不会执行
}
// 问:如果我这里写 age = 30 输出是多少
if (age >= AGE1) {
printf("成年\n");
} else if (age >= AGE2 && age < AGE3) {
printf("而立之年\n");
} else if (age >= AGE3 && age < AGE4) {
printf("正值壮年\n");
} else if (age >= AGE4) {
printf("老年\n");
}
return 0;
}
#include <stdbool.h>
#include <stdio.h>
bool isLeapYear(int year) {
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
return true;
return false;
}
int main(int argc, char const *argv[]) {
unsigned int year = 2022;
unsigned int month = 10;
unsigned int day = 24;
unsigned int total = 0; //用于天数的累加,建议是赋其初始值
switch (month) {
case 12:
total += 30;
case 11:
total += 31;
case 10:
total += 30;
case 9:
total += 31;
case 8:
total += 31;
case 7:
total += 30;
case 6:
total += 31;
case 5:
total += 30;
case 4:
total += 31;
case 3:
if(isLeapYear(year))
total += 29;
else
total += 28;
case 2:
total += 31;
case 1:
total += day;
}
return 0;
}