C语言-选择结构
关系运算符
逻辑运算符
条件运算符
if else
switch case
前面我们看到的代码都是顺序执行的,也就是从头到尾每一句都执行一遍然后结束程序,这叫顺序结构
但是对于很多情况我们不仅仅要用到顺序结构,我们还需要程序进行判断一些条件,然后执行某项操作。
关系运算符
关系运算符在使用时,它的两边都会有一个表达式,比如变量、数值、加减乘除运算等,关系运算符的作用就是判明这两个表达式的大小关系。
关系运算符 | 含义 |
---|---|
< | 小于 |
<= | 小于或等于 |
> | 大于 |
>= | 大于或等于 |
== | 等于 |
!= | 不等于 |
关系运算符的优先级低于算术运算符,高于赋值运算符。
C语言中将有两个操作数的运算符,称为双目运算符。一个操作数的称为单目运算符。三个操作数的称为三目运算符。
而且关系运算符的运算结果只有 0 或 1 。当条件成立结果为 1 ,当条件不成立结果为 0 。我们将运算结果 1 称为“真”,表示条件成立,将 0 称为“假”,表示条件不成立,但按照C语言的原理来说,非 0 即为真。
要提醒一点==
表示判断是否相等=
表示赋值,一定要区分开,一定不能混淆。
逻辑运算符
运算符 | 说明 | 结合性 | 举例 |
---|---|---|---|
&& | 与运算,双目 | 左结合 | 1&&0、(9>3)&&(b>a) |
|| | 或运算,双目 | 左结合 | 1||0、(9>3)||(b>a) |
! | 非运算,单目 | 右结合 | !a、!(2<5) |
逻辑运算的结果
在编写程序时我们通常认为将非零的值即为真,反过来零即为假。
但是在程序判断一个东西是否为真假后会将真假返回,返回的值则是:真 = 1;假 = 0。
- 与运算(&&)
参与运算的两个表达式都要为真,结果则为真,其中有一个表达式为假则结果也为假。
- 或运算(||)
参与运算的两个表达式其中一个为真,则返回的结果即为真,否则为假。
- 非运算(!)
参与运算的表达式为真时结果为假,参与表达式为假时结果为真。
优先级
赋值运算符(=)<&&和\|\|<关系运算符<算术运算符<非(!)
按照运算符的优先顺序可以得出:
- a>b&&c>b 等价于(a>b)&&(c>b)
- !b==c||d<a 等价于 ((!b)==c)||(d<a)
- a+b>c&&x+y<b 等价于 ((a+b)>c)&&((x+y)<b)
另外逻辑表达式可以嵌套使用
条件运算符
表达式1?表达式2:表达式3
条件运算符是整个C语言中唯一一个三目运算符,其求值规则为判断表达式1是否为真如果为真则以表达式2的值为整个表达式的值,否则以表达式3的值为整个表达式的值。
使用条件表达式需要注意以下几点:
- 条件表达式的优先级低于关系运算符和算术运算符,但高于赋值符
- 条件运算符?和:是一对运算符,不能分开单独使用。
- 条件运算符的结合方向是自右向左。例如:
a>b ? a : c>d ? c : d;
//可以理解为
a>b ? a : ( c>d ? c : d );
//他们俩实际上表达的是一个意思
if else
if else 是两个新的关键字,if表示如果,else表示否则,用来对条件进行判断,并根据判断结果执行不同的语句:
if(/*判断条件*/){
/*语句块1*/;
}
else {
/*语句块2*/;
}
如下图:
所谓语句块就是指由{}包围的一个或者多个语句的集合,如果只有一个语句也可以省略{}。
由于if else 语句可以根据不同的情况执行不同的代码,所以也叫分支结构或选择结构。例如:
#include <stdio.h>
int main()
{
int a, b, max;
printf("输入两个整数:");
scanf("%d %d", &a, &b);
if(a>b) max=a;
else max=b;
printf("%d和%d的较大值是:%d\n", a, b, max);
return 0;
}
运行结果:
输入两个整数:34 28↙
34和28的较大值是:34
只用if语句
有的时候我们需要满足一些条件执行某些语句,而不满足时则不进行任何操作,这时候我们就可以省略这个否则else
,也就是说if else 不必同时出现。
使用多个if else语句
if else语句也可以多个同时使用,构成多个分支。
if(/*判断条件1*/){
/* 语句块1 */
}
else if(/* 判断条件2 */){
/* 语句块2 */
}
else if(/* 判断条件3 */){
/* 语句块3 */
}
else if(/* 判断条件m */){
/* 语句块m */
}
else{
/* 语句块n */
}
意思是才能过上到下依次判断,当判断条件成立则执行相应语句块,然后跳出去执行if else外的代码,如果都不成立,则执行最后一个语句块n。
在使用if语句时还应注意以下几点
- 在if语句中,判断条件必须用括号括起来
- 语句块由{}包围
if语句的嵌套
#include <stdio.h>
int main(){
int a,b;
printf("Input two numbers:");
scanf("%d %d",&a,&b);
if(a!=b){ //!=表示不等于
if(a>b) printf("a>b\n");
else printf("a<b\n");
}else{
printf("a=b\n");
}
return 0;
}
运行结果:
Input two numbers:12 68
a<b
if语句嵌套时,要注意if和else的配对问题,每个else和在它前面最近且尚未配对的if匹配
switch case
if else虽然没有限制分支的数量,但是当分支过多时,用if else处理会不方便,而且容易出错,这样我们就要用到另一种选择结构语句switch case,它用来代替简单并且拥有多个分支的if else语句,记住是简单的。
switch(/* 表达式 */){
case /* 整型数值1 */: /* 语句 1 */;
case /* 整型数值2 */: /* 语句 2 */;
......
case /* 整型数值n */: /* 语句 n */;
default: /* 语句 n+1 */;
}
它执行的过程是:
-
首先计算“表达式”的值,假设为m。
-
从第一个case开始,比较“整型数值1”和m,如果他们相等,就执行冒号后面的所有语句,也就是从语句1一直执行到语句n+1,而不管后面的case是否匹配成功。
-
如果“整型数值1”和 m 不相等,就跳过冒号后面的“语句1”,继续比较第二个 case、第三个 case……一旦发现和某个整型数值相等了,就会执行后面所有的语句。假设 m 和“整型数值5”相等,那么就会从“语句5”一直执行到“语句n+1”。
-
如果直到最后一个“整型数值n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。
如果我们只是想执行其中一个分支后就直接跳过后面的分支,那么我们可以在每个分支最后加break;语句。break是C语言的一个关键字,专门用于跳出语句,所谓跳出,就是指不再执行switch中任何语句,直接略过switch,然后继续执行。
最后提醒两点:
- case后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量。
- default 不是必须的,当没有default时,如果所有case都匹配失败,那么就什么都不执行。