什么是选择结构
C程序的执行通常是按照顺序从上到下逐行执行。
而选择结构是根据某个变量或表达式的值来选择哪些语句执行,哪些语句不执行。
选择结构需要先进行条件判断(对表达式的值判断),根据表达式的值选择是否执行。
三木运算符(?:)就是一个简单的条件判断语句。
if语句
if语句是最常用的条件判断语句
if语句又分为单分支和多分支。
顾名思义,单分支只有一个分支(一次判断),多分支有多个分支(多个判断)。
单分支if语句
单分支if语句是判断表达式是否为真,为真时,执行花括号中的语句(复合语句),为假时跳过复合语句,继续执行后面的代码。
if语句中条件表达式的值只有真(0)、假(0)两个值。
单分支if语句执行流程
单分支if语句的一般形式
if(条件表达式)
{
语句序列
}
#include"stdio.h"
int main()
{int a=5;if(a>3)//4>3,表达式为真{//if后的表达式为真执行符合语句printf("a>3\n");}return 0;
}
if中的表达式值为真那么执行if语句后的第一条语句(或者说if语句的下一条语句)。
#include"stdio.h"
int main()
{int a=5;if(a>3)printf("a>3\n");//你也可以这样写if(a>3)printf("a>3\n");return 0;
}
如果在if表达式值为真后要执行多条语句就要用花括号括起来,这样多条语句就变成了一条复合语句。(你可以把符合语句看成一条语句)
#include"stdio.h"
int main()
{int a=5;if(a>4){//这条复合语句是if后的第一条语句 printf("a>4\n");printf("我在if中执行"); } return 0;
}
if中也可以直接放一个变量,在C语言的条件判断语句中不为0的值都为真。
#include"stdio.h"
int main()
{int a=5;if(a)//a不为0,表达式为真{printf("%d\n",a);}return 0;
}
我们之前讲的关系运算符和逻辑运算符大多在if中使用,用来判断运算符两边的关系是否为真。
#include"stdio.h"
int main()
{int a=5,b=3,c=100,d=4;if(a>b)//a是否大于b if(a>=b)//a是否大于或等于b if(a<b)//a是否小于b if(a<=b)//a是否小于或等于b if(a==b)//a是否等于b if(a!=b)//a是否不等于b if(a>=b&&a>=d)//a大于等于b并且a大于等于d(两个表达式必须同时满足)if(a>c||a>d)//a大于c或者a大于d(两个表达式满足一个就可)return 0;
}
如果有多个单分支if,那么每个if都要判断。
#include"stdio.h"
int main()
{int a=5,b=3;if(a>b){printf("a大于b\n"); }if(a>=b){printf("a小于或等于b\n");}if(a==b){printf("a等于b\n");}if(a!=b) {printf("a不等于b\n");}return 0;
}
多分支if语句
多分支if语句中如果表达式的值为假,那么继续判断下一个分支,如果某一个分支表达式为真,后面的所有分支都不执行(也就是说这个多分支if执行完了)。
多分支if语句的一般形式为:
if(条件表达式)
{
}
else if(条件表达式)
{
}
.
.
.
else
{
}
#include"stdio.h"
int main()
{int a=3,b=5;if(a>b){printf("a大于b\n"); }else if(a>=b)//第一个分支{printf("a小于或等于b\n");}else if(a<b)//第二个分支{printf("a小于b\n");}else if(a!=b) {printf("a不等于b\n");}else//可以没有{printf("都不满足\n");}printf("多分支if执行完了\n");return 0;
}
多分支if语句可以有多个else if,最后一个else是在所有分支的表达式都为假时执行。(也可以没有else)
嵌套
无论是单分支if还是多分支if,他们都都可以嵌套(相互嵌套)
单分支和单分支嵌套
#include"stdio.h"
int main()
{int a=3,b=5,c=4;if(a<b){if(a<c){}}return 0;
}
单分支和多分支嵌套
#include"stdio.h"
int main()
{int a=3,b=5,c=4;if(a<b){if(a>c){}else if(a<c){}else if(a==c){}}return 0;
}
多分支和单分支嵌套
#include"stdio.h"
int main()
{int a=3,b=5,c=2;if(a>b){if(a>c){ }}else if(a>c){if(b>c){}}return 0;
}
多分支值和多分支嵌套
#include"stdio.h"
int main()
{int a=3,b=5,c=2;if(a>b){if(c>b){}else if(a>c){}}else if(a>c){if(b>c){}else if(a>b){}}return 0;
}
多分支嵌套时,else总是于最近的if匹配。
switch语句
switch是一个多分支的选择结构,又称为开关语句。
switch语句的一般形式:
switch(表达式)
{
case 常量表达式1 : 语句1 break;
case 常量表达式2 : 语句2 break;
.
.
.
default : 语句n
}
执行流程:
先判断switch的表达式的值是否于第一个case的常量表达式相等,不相等判断是否等于下一个case的常量表达式,相等执行 : 后面的语句以及后面所有case :后的语句。(后面case的常量表达式不参与判断直接执行)
如果switch的表达式和所有case的常量表达式都不相等,那么执行default 后面的表达式。(default可以没有)
#include"stdio.h"
int main()
{int a=3;switch(a){case 5 :printf("5\n");case 4 :printf("4\n");case 3 :printf("3\n");//case执行后还会执行后面所有 : 后的语句。case 2 :printf("2\n");case 1 :printf("1\n");default :printf("哈哈\n");}return 0;
}
为避免这种情况发生要使用break语句。
break的作用是结束这个语句。由于switch后是一个复合语句,运行了break语句就是告诉程序这个语句执行结束,即使break后还有语句也不执行。
#include"stdio.h"
int main()
{int a=3;switch(a){case 5 :printf("5\n");break;case 4 :printf("4\n");break;case 3 :printf("3\n");break;//执行break后结束这个复合语句case 2 :printf("2\n");break;case 1 :printf("1\n");break;default :printf("哈哈\n");break;}return 0;
}
default这条语句后如果有break可以放在任何位置,不然执行default后所有 case都会执行一遍。(default语句即使有break也建议放最后)