3 逻辑运算、分支和循环

目录

一、逻辑运算

(一)关系运算符

        1、关系运算符

        2、关系表达式

        (1)概念

        (2)表达式结果值

(二)逻辑操作符

        1、逻辑操作符

        2、逻辑表达式

        3、短路求值

(三)条件操作符

二、分支

(一)if 语句 

        1、if 语句

        2、else

        3、if 嵌套语句

        4、else悬空问题

(二)switch 语句

三、循环

(一)while 、do...while 语句

        1、while 语句

        2、do...while 语句

(二)for 语句

(三)循环控制语句

        1、break

        2、continue

        3、goto

四、有意思的点

(一)避免【等于 "==" 】写成【赋值 "=" 】的建议

(二)【逻辑非 "!"】的使用场景


一、逻辑运算

(一)关系运算符

        1、关系运算符

        关系运算,又称比较运算,将两个值进行比较;

        在比较中使用的运算符就称为“关系运算符”

7e979d0bdd50466392433ffdf053857c.png

6种关系运算符含义及优先级

表出处:王健伟,《C++新经典》,清华大学出版社,2020年8月出版,表4.1

        

        注:

        【等于 "=="】 是两个等号,一定不能写成一个等号的【赋值 "="】 

        多个关系运算符不宜连用,关系运算符从左向右计算,连用时通常达不到想要的结果:

x < y < z  
实际执行:(x < y) < z
要求:输入一个年龄,若年龄在18~36岁之间,输出“青年”

#include <stdio.h>

int main()
{
    int age = 0;
    printf("请输入年龄:");
    scanf("%d", &age);
    if(18 <= age <= 36)
        printf("青年");

    return 0;
}

结果是无论输入几岁都会输出青年  
实际判断:(18 <= age) <= 36, 即 (0或1) 与 36 比较
改进:if(18 <= age && age <= 36)

        2、关系表达式

        (1)概念

                用 关系运算符 将两个表达式连接起来的式子就叫关系表达式。

        (2)表达式结果值

                在 C语言中, “真”用 true 表示,也可以用1表示;“假”用 false 表示,也可以用 0 表示;

                可以认为 true == 1,false == 0 ;

                所以,关系表达式(比较)的结果值是 0 或者 1,也可以认为是 true 或者 false。

(二)逻辑操作符

        1、逻辑操作符

        逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式

cd67e5c3d11e40d2a66d6d39230ebccd.png

C语言提供的三种逻辑操作符

表出处:王健伟,《C++新经典》,清华大学出版社,2020年8月出版,表4.2

       

        2、逻辑表达式

        用逻辑运算符关系表达式(比大小式子)连接起来,就构成了逻辑表达式

        下面用 a 表示一堆表达式,b 表示另一堆表达式,来说明逻辑表达式的运算规则

ab563289392641e79358a5fa818af19b.png

逻辑运算真值表

表出处:王健伟,《C++新经典》,清华大学出版社,2020年8月出版,表4.3

         运算规律总结:       

                &&  有假则假

                ||     有真则真

                !    取反

        注: C语言中,参加运算的对象(或者说是表达式)非0表示真,0表示假;

                逻辑判断的结果值不是真(==1),就是假(==0),

printf("结果为:%d\n", 4 && 5);
输出:结果为:1
参与【逻辑与(and)】运算的对象4和5都非0,都表示真,运算的结果值为真(==1)

int a = 6;
printf("结果为:%d\n", !a);
输出:结果为:0
参与【逻辑非(not)】运算的对象【6】非0,表示真,运算的结果值为假(==0)

        3、短路求值

        逻辑运算符还有一个特点:它总是先对左侧的表达式求值,再对右边的表达式求值;

        如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”,利用的正是运算规律总结:

                &&  有假则假

                ||     有真则真

if(month >= 3 && month <= 5)
如果是month >= 3进行判断运算时结果为假(==0),则不进行后面的判断运算
if(month == 12 || month == 1 || month == 2)
如果month == 12判断结果为真(==1),则不进行后面的判断运算

过程:【a (①是否满足)】逻辑操作符 【b(②是否满足)】 逻辑操作符 【c (③是否满足)】

(三)条件操作符

        也被称为三目运算符(三个操作数,C语言中唯一一个三目运算符)

ee13b0af1cb249a198d6c7cbafd4e38b.png

        计算逻辑:

                每个表达式都是运算对象(非0表示真,0表示假)

                如果【表达式1】为真(非0),【表达式2】计算,计算的结果是整个表达式的结果;

                如果【表达式1】为假(为0),【表达式3】计算,计算的结果是整个表达式的结果。

       

        注:结合顺序为从右向左:

max = a > b? a:c > d? c:d
等价于
max = a > b? a:(c > d? c:d)

二、分支

        进阶版条件操作符

(一)if 语句 

        if 语句来判断给定的条件是否满足,根据判断的结果决定执行什么样的操作

        if 语句有三种形式:

        1、if 语句

if (表达式)
    语句;

        执行流程:

                表达式成立(非0,为真),则语句执行,

                表达式不成立(0,为假),则语句不执行

       

        注:

                if 语句只能控制一条语句,所以 if(表达式)后加 “ ; ”就表示 if 语句控制的是空语句

if(表达式);

                多条语句用 { } 括起来(一块复合语句 { } 也是“一条语句”)

        2、else

if(表达式)
    语句1;
else
    语句2;

        执行流程:

                表达式成立则执行语句1,否则执行语句2;

        注:        

                else 语句也只能控制一条语句;

                多条语句用 { } 括起来(一块复合语句 { } 也是“一条语句”)

        3、if 嵌套语句

if(表达式1)
    语句1;
else
    {
        if(表达式1)
            语句2;
        else
            {
                if(表达式3)
                 ...
            }

    }

        等价于

if(表达式1)
    语句1;
else if(表达式2)
    语句2;
else if(表达式3)
    语句3;
...

        执行流程:

                如果判断表达式1成立,则执行语句1,否则看表达式2是否成立,则执行语句2......如果表达式m成立,则执行语句m......

        4、else悬空问题

        有多个 if 和 else ,且代码风格不好造成的

if(a == 1)
    if(b == 2)
        printf("hehe\n");
else
    printf("haha\n");

        解决:else和最近的if匹配

(二)switch 语句

        switch 语句是一种特殊形式的 if...else 结构,用于判断条件有多个结果的情况。它把多重的else if 改成更易用、可读性更好的形式。

switch (表达式) 
{
    case 常量表达式1: 
        1或多条语句;
        break;
    case 常量表达式2: 
        1或多条语句;
        break;
    .
    .
    .
    default: 
        1或多条语句;
        break;
}

        常量表达式:常量组成的表达式,如:"5"、"A"、"2+6" 等       

        执行流程:

                switch后面表达式的值若满足(等于)任何某个case后面的常量表达式,则执行该case后面的1或多条语句,直到遇到break为止;

                如果所有case条件都不满足:①不处理 ;②执行default中的语句来处理

        注:

                ① switch后面的表达式可以是整型表达式,也可以是字符表达式;因为字符型数据和整型数据之间可以互通使用。【知识篇(一)、十二、(九)】

                 各个case之间、case和default之间没有先后顺序,谁在上面or下面都行;

                ③ 绝对不要忘记break语句,如果某一个case语句的后面没有break语句,代码会继续往下执行,有可能执行其他case语句中的代码,直到遇到break语句或者switch语句结束;

                ④ case后面有多条语句,加不加大括号 { } 都行;

                ⑤ default可以没有,那么所有case都不满足的条件下,整个switch相当于没被执行;

                ⑥ 多个case条件可以挨着写在一起,其中任意一个条件成立时共用一组执行语句

case 3:
case 4:
    printf("都很帅");
    break;

三、循环

(一)while 、do...while 语句

        1、while 语句

while(表达式)
    语句;

        执行流程:

                首先执行判断表达式,表达式的值为0,循环直接结束;

                表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。

        2、do...while 语句

do
    语句;
while(表达式);

        执行流程:

                do...while 循环先直接执行循环语句,然后再执行 while 后的判断表达式,

                表达式为真,就会进入下一次循环语句,表达式为假,退出循环

        注:

                do...while 循环体至少执行一次;

                while 后面不要忘记分号

(二)for 语句

for(表达式1;表达式2;表达式3)
    语句;

        表达式1  用于循环变量的初始化

        表达式2  用于结束循环的判断

        表达式3  用于循环时变量的调整

        执行流程:

                首先执行【表达式1】初始化循环变量,

                接下来执行【表达式2】的判断部分,如果【表达式2】 == 0 , 则结束循环;如果【表达式2】 !=0 则执行循环语句,

                循环语句执行完后,再去执行【表达式3】,调整循环变量,再去【表达式2】执行判断,【表达式2】的结果是否为0,决定循环是否继续。

                整个循环的过程中,【表达式1】初始化部分只被执行1次,剩下的就是【表达式2】、循环语句、【表达式3】在循环。

(三)循环控制语句(转向语句)

        1、break

        break 的作用是用于永久的终止循环,只要 break 被执行,直接就会跳出循环,继续往后执行循环后面的代码。

        注:多重嵌套循环中,一个break只会跳出一层循环

        2、continue

        continue 是继续的意思,在循环中的作用就是跳过本次循环中 continue 后边的代码,继续进行下一次循环的判断。

        3、goto

        可以实现在同一个函数内跳转到设置好的标号处

#include <stdio.h>

int main()
{
    printf("hehe\n");
    goto next;
    printf("haha\n");
 
next:
    printf("跳过了haha的打印\n"); 

    return 0;
}

        

        goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以建议是能不用尽量不去使用

        但是 goto 语句也不是一无是处,在多层循环的代码中,如果想快速跳出,使用 goto 就非常的方便了。

for(...)
{
    for(...)
    {
        for(...)
        {
            if(disaster)
                goto outside;
        }
    }
}

outside:
...

        本来 for循环想提前退出得使用 break,一个 break 只能跳出一层 for循环,如果3层循环嵌套就得使用3个 break 才能跳出循环,所以在这种情况下我们使用 goto 语句就会更加的快捷。

四、有意思的点

(一)避免【等于 "==" 】写成【赋值 "=" 】的建议

        当一个变量和一个常量比较相等的时候,为了避免 【等于 "==" 】 写成 【赋值 "=" 】 而不自知的情况,建议将常量写在 == 号左边  

if (3 == a)...

(二)【逻辑非 "!"】的使用场景

#include <stdio.h>

int main()
{
    int flag = 0;
    if(!flag)
    {
        printf("do something\n");
    }

    return 0;
}

        使用场景:当变量为假时,需要干什么;

        flag 为假, ! flag 就是真,为真就可以通过 if 语句的判断;

        所以上面的代码的意思就是 flag 为假,执行 if 语句中的代码


        以上博客内容仅供分享

  • 40
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值