鱼C论坛

 找回密码
 立即注册
查看: 818|回复: 7

[已解决]短路求值

[复制链接]
发表于 2020-12-24 22:53:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
短路求值
#include <stdio.h>
int main()
{
        int a=3,b=3;
       
        (a=0)&&(b=5);
        printf(" a= %d,b= %d\n",a,b);
       
        (a=1)||(b=5);
        printf(" a= %d,b= %d",a,b);
       
}

如果上面为真,下面的b为什么会等于上面的b=5
最佳答案
2020-12-24 23:36:33
本帖最后由 jackz007 于 2020-12-25 00:00 编辑
  1.         (a=0)&&(b=5);
复制代码

      逻辑表达式都是以追求表达式的值真为终极目标,根据短路逻辑,&& 两侧表达式的逻辑值必须同为真才能判断整个表达式的值为真。&& 操作是先执行左侧的表达式,并进行逻辑判断,只有在结果为真的情况下,才会继续执行右侧的表达式并进行逻辑判断,如果右边的逻辑值也同为真,才可以判定整个表达式的值为真;反之,如果左侧是逻辑假,就可以断定整个表达式的值一定是假,就不再需要继续执行右侧的表达式和判断了。现在,(a=0) 这个表达式的值为 0,其逻辑值为假,所以,右边的表达式就不会被执行了。
  1.         (a=1)||(b=5);
复制代码

      同样还是根据短路逻辑,|| 两侧的表达式只要有一侧的逻辑值为真,则整个表达式的值即为真,|| 操作也是先执行左侧的表达式,并进行逻辑判断,只有结果为假的情况下才需要继续执行 || 右侧的表达式并进行逻辑判断,如果右侧的值为真,也可以判断整个表达式的值为真;反之,如果左侧为逻辑真,就可以断定整个表达式的值一定为真,就再不需要继续执行右侧的表达式和判断了。现在,(a=1) 这个表达式的值是 1,其逻辑值为真,所以,右边的表达式自然不会执行。

      所以,在上述的两个表达式中,a 均被赋值,b 均未被赋值。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-24 23:05:17 | 显示全部楼层
本帖最后由 jackz007 于 2020-12-24 23:06 编辑

                 你这是赋值
  1.         (a = 0) && (b = 5)
复制代码

                逻辑不表达式是这样
  1.         (a == 0) && (b == 5)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-24 23:08:18 | 显示全部楼层
编译器不同,输出也会不同的。我的VS2015输出:
a = 0, b = 3
a = 1, b = 3
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-24 23:15:14 | 显示全部楼层
jackz007 发表于 2020-12-24 23:05
你这是赋值

                逻辑不表达式是这样

小甲鱼是等号
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-24 23:18:00 | 显示全部楼层
jackz007 发表于 2020-12-24 23:05
你这是赋值

                逻辑不表达式是这样

横等的话结果又不一样了 为真直接a=3,b=3了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-24 23:36:33 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-12-25 00:00 编辑
  1.         (a=0)&&(b=5);
复制代码

      逻辑表达式都是以追求表达式的值真为终极目标,根据短路逻辑,&& 两侧表达式的逻辑值必须同为真才能判断整个表达式的值为真。&& 操作是先执行左侧的表达式,并进行逻辑判断,只有在结果为真的情况下,才会继续执行右侧的表达式并进行逻辑判断,如果右边的逻辑值也同为真,才可以判定整个表达式的值为真;反之,如果左侧是逻辑假,就可以断定整个表达式的值一定是假,就不再需要继续执行右侧的表达式和判断了。现在,(a=0) 这个表达式的值为 0,其逻辑值为假,所以,右边的表达式就不会被执行了。
  1.         (a=1)||(b=5);
复制代码

      同样还是根据短路逻辑,|| 两侧的表达式只要有一侧的逻辑值为真,则整个表达式的值即为真,|| 操作也是先执行左侧的表达式,并进行逻辑判断,只有结果为假的情况下才需要继续执行 || 右侧的表达式并进行逻辑判断,如果右侧的值为真,也可以判断整个表达式的值为真;反之,如果左侧为逻辑真,就可以断定整个表达式的值一定为真,就再不需要继续执行右侧的表达式和判断了。现在,(a=1) 这个表达式的值是 1,其逻辑值为真,所以,右边的表达式自然不会执行。

      所以,在上述的两个表达式中,a 均被赋值,b 均未被赋值。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-17 09:39:34 | 显示全部楼层
这个最终结果应该是a=1,b=3吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-17 09:40:22 | 显示全部楼层
废物弟弟云小舟 发表于 2021-1-17 09:39
这个最终结果应该是a=1,b=3吧

为什么是b=5咧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-2 19:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表