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。

  1. 与运算(&&)

参与运算的两个表达式都要为真,结果则为真,其中有一个表达式为假则结果也为假。

  1. 或运算(||)

参与运算的两个表达式其中一个为真,则返回的结果即为真,否则为假。

  1. 非运算(!)

参与运算的表达式为真时结果为假,参与表达式为假时结果为真。

优先级

赋值运算符(=)<&&和\|\|<关系运算符<算术运算符<非(!)

按照运算符的优先顺序可以得出:

  • 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 */;
}

它执行的过程是:

  1. 首先计算“表达式”的值,假设为m。

  2. 从第一个case开始,比较“整型数值1”和m,如果他们相等,就执行冒号后面的所有语句,也就是从语句1一直执行到语句n+1,而不管后面的case是否匹配成功。

  3. 如果“整型数值1”和 m 不相等,就跳过冒号后面的“语句1”,继续比较第二个 case、第三个 case……一旦发现和某个整型数值相等了,就会执行后面所有的语句。假设 m 和“整型数值5”相等,那么就会从“语句5”一直执行到“语句n+1”。

  4. 如果直到最后一个“整型数值n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。

如果我们只是想执行其中一个分支后就直接跳过后面的分支,那么我们可以在每个分支最后加break;语句。break是C语言的一个关键字,专门用于跳出语句,所谓跳出,就是指不再执行switch中任何语句,直接略过switch,然后继续执行。

最后提醒两点:

  • case后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量。
  • default 不是必须的,当没有default时,如果所有case都匹配失败,那么就什么都不执行。

Posts in this Series