C语言选择
文章目录
- 1. if 函数
- 1.1 else
- 1.2 else if
- 2.条件操作符
- 3. switch 函数
1. if 函数
if 语句的语法形式如下:
if(条件表达式){// 条件为真时执行的代码}表达式成立(为真),则语句执行;表达式不成立(为假),则语句不执行。
1.1 else
else 用于处理当 if 内的表达式为假时的情况。例如:
if(条件表达式){// 条件为真时执行的代码}else{// 条件为假时执行的代码}举例
intnum=7;if(num%2==0){printf("%d 是偶数\n",num);}else{printf("%d 是奇数\n",num);}1.2 else if
当我们需要多个选择时,就需要使用 else if 来帮助我们,这也称作嵌套 if。举例:```c
int score = 85;
if (score >= 90) {
printf(“优秀\n”);
} else if (score >= 80) {
printf(“良好\n”);
} else if (score >= 60) {
printf(“及格\n”);
} else {
printf(“不及格\n”);
}
## 1.3 悬空 else 问题 例如下面的代码: ```c int a = 3; int b = 0; if (a > 0) if (b > 0) printf("a 和 b 都大于 0\n"); else printf("a 不大于 0\n");从缩进上看,else 似乎想与外层的if (a > 0)配对;但 C 语言的语法规则规定,else 会优先与离它最近、且尚未配对的if (b > 0)配对。因此当a > 0成立而b > 0不成立时,程序会执行printf("a 不大于 0\n"),很容易造成逻辑错误。
为避免歧义,建议在嵌套 if 时始终使用大括号{}明确划分每个分支的归属,如:
if(a>0){if(b>0){printf("a 和 b 都大于 0\n");}}else{printf("a 不大于 0\n");}这样 else 的归属一目了然,程序的可读性和正确性都能得到保证。
2.条件操作符
条件操作符也被称为三目操作符(ternary operator),它将二选一的 if-else 语句压缩到了 1 行。其基本语法如下:```c
条件表达式 ? 表达式1 : 表达式2;
执行时,程序会先计算条件表达式:如果条件为真(非零),就计算并返回表达式 1 的值;如果条件为假(零),则计算并返回表达式 2 的值。需要注意,条件操作符只会执行其中一个分支,不会同时计算两个表达式。 例如,求两个整数中的较大值: ```c int a = 10; int b = 20; int max; max = (a > b) ? a : b; printf("max = %d\n", max);上面的例子与下面的 if-else 写法完全等价:
intmax;if(a>b){max=a;}else{max=b;}条件操作符本身是一个表达式,它的结果可以直接参与赋值、作为函数参数,或者用在输出语句中。例如,判断一个数的奇偶性并直接输出:
intnum=7;printf("%d 是%s\n",num,(num%2==0)?"偶数":"奇数");使用条件操作符时有几点需要留意:表达式 1 和表达式 2 的类型最好保持一致,避免不必要的类型转换;当逻辑较复杂时,应避免多层嵌套,必要时加括号保证优先级清晰,否则代码可读性会明显下降。
总体而言,条件操作符适合简单的二选一取值场景,写法更简洁;而 if-else 则更适合包含多条语句或复杂逻辑判断的场景。
3. switch 函数
switch 语句是另一种多分支选择结构,它根据表达式的值跳转到对应的 case 分支执行,适用于根据某个变量的离散取值进行分支判断的场景:
switch(表达式){case常量1:// 表达式等于常量1时执行break;case常量2:// 表达式等于常量2时执行break;default:// 表达式不匹配任何 case 时执行break;}每个 case 分支末尾的 break 语句至关重要,它用于跳出 switch 结构,防止“穿透”(fall-through)——即执行完当前分支后继续执行下一个分支。例如根据星期数字输出对应的星期名称:
intday=3;switch(day){case1:printf("星期一\n");break;case2:printf("星期二\n");break;case3:printf("星期三\n");break;default:printf("无效的星期数字\n");break;}如果不加入 break,则代码为:```c
int day = 3;
switch (day) {
case 1:
printf(“星期一\n”);
case 2:
printf(“星期二\n”);
case 3:
printf(“星期三\n”);
default:
printf(“无效的星期数字\n”);
}
当我输入 1 时,结果会依次打印,产生错误。  与 if-else if 相比,switch 的优点是结构清晰、可读性强,适合分支较多且条件为固定值的场景;而 if 语句则更灵活,可以处理复杂的逻辑表达式和范围判断,但千万不要忘记加上 break。