阿尼key 发表于 2020-12-24 22:53:30

短路求值

短路求值
#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

jackz007 发表于 2020-12-24 23:05:17

本帖最后由 jackz007 于 2020-12-24 23:06 编辑

               你这是赋值
      (a = 0) && (b = 5)
                逻辑不表达式是这样
      (a == 0) && (b == 5)

风过无痕1989 发表于 2020-12-24 23:08:18

编译器不同,输出也会不同的。我的VS2015输出:
a = 0, b = 3
a = 1, b = 3

阿尼key 发表于 2020-12-24 23:15:14

jackz007 发表于 2020-12-24 23:05
你这是赋值

                逻辑不表达式是这样

小甲鱼是等号

阿尼key 发表于 2020-12-24 23:18:00

jackz007 发表于 2020-12-24 23:05
你这是赋值

                逻辑不表达式是这样

横等的话结果又不一样了 为真直接a=3,b=3了

jackz007 发表于 2020-12-24 23:36:33

本帖最后由 jackz007 于 2020-12-25 00:00 编辑

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

      所以,在上述的两个表达式中,a 均被赋值,b 均未被赋值。

废物弟弟云小舟 发表于 2021-1-17 09:39:34

这个最终结果应该是a=1,b=3吧

废物弟弟云小舟 发表于 2021-1-17 09:40:22

废物弟弟云小舟 发表于 2021-1-17 09:39
这个最终结果应该是a=1,b=3吧

为什么是b=5咧?{:9_241:}
页: [1]
查看完整版本: 短路求值