//单分支结构
if(表达式)
语句;
//双分支结构
if(表达式)
语句1;
else
语句2;
//多分支结构
if(表达式1)
语句1;
else if(表达式2)
语句2;
……
else
语句n;
#include二、注意要点 1、一个分支只能控制一条语句或者代码块//代码1 int main() { int age = 0; scanf("%d", &age); if(age<18) { printf("未成年n"); } return 0; } //代码2 #include int main() { int age = 0; scanf("%d", &age); if(age<18) { printf("未成年n"); } else { printf("成年n"); } return 0; } //代码3 #include int main() { int age = 0; scanf("%d", &age); if(age<18) { printf("少年n"); } else if(age>=18 && age<30) { printf("青年n"); } else if(age>=30 && age<50) { printf("中年n"); } else { printf("老年n"); } return 0; }
if语句条件成立时,如果要执行语句为多条语句,则必须将所要执行的多条语句用代码块括起来。一对 { } 就是一个代码块。
//代码1
if (a>5)
printf("a大于5");
a++;
//代码2
if (a>5)
{
printf("a大于5");
a++;
}
//这里两段代码表达的意思是不一样的,代码1如果条件成立则执行printf("a大于5");执行到此该分支语句就结束了,随后执行a++;是按照顺序结构依次执行的。也就是说无论条件是否成立,代码1总会执行a++;,但代码2只有在条件成立时才会执行a++;。
2、多分支语句中else与离else最近且未匹配的if匹配
多分支语句中,若出现if与else无法两两匹配情况时,从第一个else开始,else与离其最近且未匹配的if匹配(如果最近且未匹配的if被限制在了代码块内,则上述原则不成立)。
//代码1 #include3、代码风格int main() { int a = 0; int b = 2; if (a == 1) if (b == 2) printf("hehen"); else printf("hahan"); return 0; }//执行结果为:(什么都没输出) //代码2 #include int main() { int a = 0; int b = 2; if (a == 1) if (b == 2) printf("hehen"); else printf("hahan"); return 0; }//执行结果为: (什么都没输出) //代码3 #include int main() { int a = 0; int b = 2; if (a == 1) { if (b == 2) printf("hehen"); } else printf("hahan"); return 0; }//执行结果为:haha //比较代码1,2,3,其中代码1和代码2中else都和离它们最近的if匹配,代码3由于离else最近的if是第一个if的执行内容(被代码块括住了),所以无法与代码块外的else匹配,故else只能与第一个if匹配。
为了增加代码的可读性,好的代码风格很重要。
- 分支语句中,适当使用代码块能减少对代码的误解。
//代码1
int max2 (int x, int y)
{
if(x>y)
{
return x;
}
return y;
}
//代码2
int max2 (int x, int y)
{
if(x>y)
{
return x;
}
else
{
return y;
}
}//尽管代码1和代码2所表达的意思是一样的,但代码1容易被误解。注意return语句一旦执行代表该函数结束,即使后面仍有语句也不会执行。
- 条件表达式如果出现比较一变量与常量是否相等时,常将常量写在前面,以避免漏写等号造成代码出现逻辑错误。
//代码1
int num = 1;
if(num == 5)
{
printf("hehen");
}
//代码2
int num = 1;
if(num = 5)
{
printf("hehen");
}//漏写等号,后患无穷
//代码3
int num = 1;
if(5 == num)
{
printf("hehen");
}
switch语句
一、语法结构
1、结构
switch(整型表达式)
{
case **整型常量**表达式: 语句;
(break;)//根据需要确定是否写break语句
……
(default :
语句;)根据需要确定是否写default语句
}
2、示例 int day = 0;
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;
default :
printf("您输入的数据有误n");
}
二、注意要点
1、表达式要求
-
switch语句中能传入的条件表达式只能是整型表达式(char也可以,系统可以将字符型数据按ASCII码强制转换成整型。浮点型数据比整型级别高,系统无法转换成整型,所以不算整型表达式)。
-
case后紧跟的表达式也只能是整型常量表达式(必须是常量,跟变量会报错。也可以是用单引号引起来的单个字符,系统会按照ASCII码将其转化成整型处理)。
总而言之,从广义上讲,字符型也能算作整型。
//代码1
int main()
{
int day = 96;
switch (day+1)
{
case 'a':
printf("nice!n");
break;
case 98:
printf("好耶!n");
break;
default :
printf("关闭n");
}
return 0;
}
//代码2
int main()
{
char day = 'a';
switch (day+1)
{
case 'a':
printf("nice!n");
break;
case 98:
printf("好耶!n");
break;
default :
printf("关闭n");
}
return 0;
}
2、case标签与break的作用
-
case标签只是让程序根据条件表达式找到switch语句的执行入口,随后按照顺序结构依次执行语句(如果没有break语句即使后面的case标签不符合条件,其后语句也会被执行)。
-
switch语句无法直接实现分支,搭配break语句才能达到分支的目的。break的作用就是将switch语句分成若干部分,作为switch出口跳出switch语句。
-
程序根据条件表达式和case标签找到入口,遇到break即找到switch语句出口跳出。
//代码1
int main()
{
int day = 96;
switch (day+1)
{
case 23://不符合条件,寻找下一个case标签
printf("!!!n");
case 'a'://符合条件,程序从该行开始往下执行,只有遇到break才跳出switch语句
printf("nice!n");
case 98://没有遇到break,继续往下执行
printf("好耶!n");
break;//遇到break,跳出switch语句,后面本switch内的语句不再执行
case 33:
printf("!!!n");
default :
printf("关闭n");
}
return 0;//跳到该处继续执行
}
3、default子句的作用
-
当表达的值与所有的case标签的值都不匹配又想让switch语句给一个反馈的时候,可以在任何一个case标签可以出现的位置写上default子句。当 switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句。
-
default子句不一定要写在语句结尾(开头、中间、结尾都可以),只要switch表达式的值不匹配所有case标签的值就能执行default子句。
#includeint main() { int n = 1; int m = 2; switch (n)//n为1 { case 1://入口处,程序从此处执行 m++;//m变为3 case 2://上一case子句没有break,继续向下执行 n++;//n变为2 case 3://上一case子句没有break,继续向下执行 switch (n)//n为2 {//switch允许嵌套使用 case 1: n++; case 2://内层switch语句入口处,程序从此处执行 m++;//m变为4 n++;//n变为3 break;//跳出内层switch } case 4://继续执行 m++;//m变为5 break;//跳出外层break default: break; } printf("m = %d, n = %dn", m, n);//m=5,n=3 return 0; }



