一、选择结构 ----- if
(一)分支结构
1、单分支:
语法:if(判别式) 或 if(判别式) // 括号里面的判别式为真(值非0),则执行代码块。
代码块; { 代码块;}
代码示例:
#include<stdio.h>
int main(){
int age = 10;
if(age<18)
printf("未成年\n");
return 0;
}
2、双分支:
语法:if(判别式) 或 if(判别式)
代码块1; { 代码块;}
else else
代码块2; { 代码块2;}
// 判别式为真(值为非0),执行代码块1,否则执行代码块2。
代码示例:
#include<stdio.h>
int main(){
int age = 10;
if(age<18)
{ printf("未成年\n"); }
else
{ printf("已成年\n"); }
return 0;
}
3、多分支:
语法:if(判别式1)
{ 代码块1;}
else if(判别式2)
{ 代码块2;}
…………
…………
else if(判别式n)
{ 代码块n;}
else{ 代码块n+1;}
// 判别式1为真,执行代码块1,否则跳到判别式2;若判别式2为真,执行代码块2;按此种顺序一次判断,直至判别式为真,执行相应代码块后退出选择结构,若判别式式全为假,则执行else后的代码块n+1,然后退出选择结构。
代码示例:
#include<stdio.h>
int main(){
int age = 10;
if(age<18)
{ printf("未成年\n"); }
else if(age>18 && age<28)
{ printf("青年\n"); }
else if(age>28 && age<50)
{ printf("壮年\n"); }
else
{ printf("准备退休了\n"); }
return 0;
}
// 上述逻辑等价于以下逻辑
if(age<18)
{
printf("未成年\n");
}
else
{
if(age>18 && age<28)
{ printf("青年\n"); }
else if(age>28 && age<50)
{ printf("壮年\n"); }
else
{ printf("准备退休了\n"); }
}
(二)错误示例
1、悬空else
#include<stdio.h>
int main()
{
int a = 0
int b = 2;
if(a == 1)
if(b == 2)
printf("AA\n");
else
printf("BB\n");
return 0;
}
// 发现上述代码不会有任何输出
// 原因:else 优先匹配未与其它else匹配的if代码块,以下为修改后的示例。第二个if与else组合成为了第一个if的代码块,然后判别式为假,不会继续进行第二个if判断,直接结束选择结构
// 修改过后
if(a == 1)
{
if(b == 2)
{ printf("AA\n"); }
}
else
{ printf("BB\n"); }
2、数学的惯性思维:
#include<stdio.h>
int main(){
int age = 10;
if(18<=age<28)
printf("青年\n");
return 0;
}
// 分析:优先判断左边的条件:18<=age 结果为假(值为0)
// 然后形成: if(0<28) 判断结果为真,执行语句:printf("青年\n");
// 18<=age<28为错误判别式。正确规范:age>=18 && age<28
3、写等于判断小技巧:
#include<stdio.h>
int main(){
int num = 8;
if( num = 6)
printf("哈哈\n");
return 0;
}
// 结果:输出了哈哈;因为 num = 6的判别值为真。正确书写为 num == 6
// 避免反这种疏漏,产生bug,可以将数字放在前面:6 == num; 即使疏漏写为 6 = num 也会报错
二、选择结构 ----- switch
(一)常规写法与注意事项
语法:
switch(n)
{
case 表达式1: 语句1;
case 表达式2: 语句2;
………………………
………………………
case 表达式n: 语句n;
default: 语句n+1;
}
#include<stdio.h>
int main()
{
int w = 3;
switch(w)
{
case 1: printf("周1\n");
case 2: printf("周2\n");
case 3: printf("周3\n");
case 4: printf("周4\n");
case 5: printf("周5\n");
case 6: printf("周6\n");
case 7: printf("周末\n");
}
return 0;
}
//输出:周3到周末。因为case只是决定执行程序的入口,与表达式的值相匹配时,只依次往下执行
// 修改后的代码。此时用break结束语句,不会依次往下执行
switch(w)
{
case 1: printf("周1\n");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("周末\n");break;
default: printf("数值错误\n"); // default表示无论前面是否执行,这里都会默认执行
}
// case 与case ,case与default之间的顺序可以变化。如:
switch(w)
{
default: printf("数值错误\n");
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("周末\n");break;
case 1: printf("周1\n");break;
}
(二)小技巧
#include<stdio.h>
int main()
{
int w = 3;
switch(w)
{
case 1:
case 2:
case 3:
case 4:
case 5: printf("工作日\n");break;
case 6:
case 7: printf("休息啦\n");break;
}
return 0;
}
// 实现w为1-5时,打印工作日;w为6,7时,打印休息啦
(三)嵌套写法
#include<stdio.h>
int main()
{
int x = 1;
int y = 2;
switch(x)
{
case 1: y++;
case 2: x++;
case 3:
switch(x)
{
case 1: x++;
case 2: x++; y++; break;
}
case 4: y++:
break;
default:
break;
}
printf("x = %d y = %d\n",x,y);
return 0;
}
// 输出结果:x = 3 y = 5