第三章 判断过程(一)

C语言中的判断过程

在我们现实生活中,我们总是做出判断
例如:如果外面下雨,我就坐车去学校。如果外面不下雨,我就骑自行车去学校

算术比较

c中比较两个值有6个关系运算符,如表:

运算符 比较
< 左操作数小于右操作数
<= 左操作数小于等于右操作数
== 左操作数等于右操作数
!= 左操作数不等于右操作数
> 左操作数大于右操作数
>= 左操作数大于等于右操作数

基本的if语句

有了比较关系运算符后,就需要用一个语句来做判断最简单的语句就是if语句。例如比较自己的体重和他人的体重,代码如下:

#include <stdio.h>
int main(void)
{
    int my_weight=170; //定义我的身高为170
    int you_weight=175;//定义你的身高为175
    if(you_weight>my_weight) //如果你的身高大于我的身高
    printf("你比我高"); //printf就会执行 你比我高
    if(you_weight<my_weight)  //如果你的身高小于我的身高
    printf("我比你高"); //printf就会执行我比你高
    if(you_weight==my_weight)  //如果你的身高小于我的身
    printf("我们一样高"); //printf就会执行你和我意昂高
}
结果为:你比我高

这三个if语句,比较表达式位于if关键字后面的括号里,如果比较结果为true,就执行if后面的语句,如果表达式为false,就跳过if后面的语句

  • if语句的一般形式或语法如下:

    if(expression)
       statement1;
    Next_statement;
    

    在第一行的末尾没有分号,是因为if关键字和其后的一行组合在一起如下:

    if(expression) statement1;
    Next_statement;
    

    但为了简洁,一般把statement1放在新的一行

    if 语句的执行过程如图

    • 把一个数值转换为bool类型时,会得到一个布尔结果
    • if语句的控制表达式要生成一个布尔结果
    • 所以编译器要把if表达式的数值转换为bool类型。
    • 有时在程序中会使用它测试计算式的非零结果
    • 如下面的语句:
      if(count)
      printf("count的值不为零");
      

      只有count非零,printf才会执行,如果count的值为零,表示if表达式为false,任何非零的count值都会使表达式的结果为true,如下代码:

#include <stdio.h>
int main(void)
{
      int a;
      printf("请输入一个数字");
      scanf("%d",&a);
      if(a) 
      printf("a的值不为零");
}
如果输入2
结果为:a的值不为零
如果输入0
结果为: 
当a的值为零,表示if表达式为false,printf不会执行

扩展if语句:if-else

可以扩展if语句提供更多的灵活性例如:
 如果今天的雨比昨天大
 我就带上雨伞
 否则
 我就穿上皮夹克
 然后去学校

这就是if-else提供的判断方式.if-else语句的语法如下:

 if(experssion)
   statement1;
else
   statement2;
Next_statement;
  • 如果expression的值是true,就执行statement1,之后执行Next_statement。
  • 如果expression的值是false,就执行statement2,之后执行Next_statement。
  • 执行过程如图:

在if语句中使用代码块

可以把几个语句放在一个{}中,在if表达式为true时,提供多个执行的语句例如:

如果天气晴朗
我就去公园,吃野餐,然后回家
否则
我就留在家中,看足球赛,喝啤酒

if语句的语法如下:

if(expression)
{
   statementA1;
   statementA2;
}
else
{
   statementB1;
   statementB2;
}
Next_statement;
  • 如果expression等于true,就执行if后面括号中所有的语句
  • 如果expression等于false,就执行else后面括号中所有的语句
  • 在两种情况下程序都执行 Next_statement

嵌套的if语句

if语句也可以包含if语句。例如

如果天气很好
我就到院子里去
  如果天气很冷
  我就坐在太阳下
  否则
  我就坐下树荫下
否则
我就呆在屋内
然后喝一些柠檬水

if语句的语法如下:

if(expression1)
{
  statementA;
  if(expression2)
  statementB;
 else
  statementC;
 }
 else
  statementD;
 statementE; 

第二个if语句只有在第一个if语句为true时才执行,其逻辑如图

逻辑与算符

逻辑与运算符&&

(逻辑与)运算符&&是一个二元运算符,因为它合并两个逻辑表达式,即两个值为true或false的表达式,例如:

if(age>12 && age<20)
printf("你正式成为青少年");

&& (逻辑与)

  • 当逻辑与左边为false(假),则不再进行逻辑与右边的判断,结果为false(假)

  • 当逻辑与左边为true(真)则进行右边判断,右边为false(假),结果为false(假)

  • 当逻辑与左边为true(真)则进行右边判断,右边也为true(真),则结果为true(真)

逻辑或运算符||

(逻辑或)运算符||用于两个或多个条件为true的情行。如果运算符||的一个或两个操作数是true,其结果就是true.只有两个操作数都是false,结果才是false.下面是使用这个运算符的例子:

#include <stdio.h>
int main()
{
    int a=6;
    if(a>7 || a>9 || a==7 || a==5 || a==6)
    printf("printf语句执行了");

 } 
 结果为:printf语句执行了

||(逻辑或)

  • 当逻辑或左边为false(假),继续逻辑或右边的判断,如果也为false(假),结果为false(假)

  • 当逻辑或左边为false(假),继续逻辑或右边的判断,如果为true(真),结果为true(真)

  • 当逻辑或左边为true(真),则不再进行逻辑或右边的判断,结果为true(真)

逻辑非运算符!

逻辑非运算符用 “!”表示,他是一元运算符;因为他只有一个操作数。逻辑非运算符转逻辑表达式的值,使用true和false,假设有两个变量a和b,其值分别是5和2,则表达式a>b是true,如果使用逻辑非运算符,表达式!(a>b)就是false,尽量避免使用这个运算符,它会使代码难以理解。

条件运算符

条件运算符根据一个逻辑表达式等于true和false。执行两个表达式中的一个。有时也称为三元运算符,因为他是需要3个操作数的运算符例如: 条件?表达式1:表达式2

x=y>7?25:50;
如果y>7,x就设置为25,否则x就设置为50,这是生成这一结果的一种快捷方式:

if(y>7)
  x=25;
else
  x=50; 

如下代码

 #include <stdio.h>
 int main(void)
 {
      int a,b,max;
      printf("请输入两个数字");
      scanf("%d",&max);
      max=a>b?a:b;//当a>b为true,max的值为a。当为false,max的值为b.
      printf("max=%d",max);
      return 0;
}

运算符的优先级

优先级 运算符 结合律
1 后缀运算符:[] () · -> ++ –(类型名称){列表} 从左到右
2 一元运算符:++ – ! ~ + - * & sizeof_Alignof 从右到左
3 类型转换运算符:(类型名称) 从右到左
4 乘除法运算符:* / % 从左到右
5 加减法运算符:+ - 从左到右
6 移位运算符:<< >> 从左到右
7 关系运算符:<<= >>= 从左到右
8 相等运算符:== != 从左到右
9 位运算符 AND:& 从左到右
10 位运算符 XOR:^ 从左到右
11 位运算符 OR: 从左到右
12 逻辑运算符 AND:&& 从左到右
13 逻辑运算符 OR: 从左到右
14 条件运算符:?: 从右到左
15 赋值运算符:= += -= * = /= %= &= ^= ❘= 从右到左
16 逗号运算符:, 从左到右