C语言的与短路和或断路问题

问题描述:

本来想试一下C语言的与短路和或断路现象的,但是我用vs2019测试的的时候,发现与短路没发生,是怎么回事。还是我理解错了?求指点

img

#include<stdio.h>
int main()
{
    int x, y, z;
    x = y = z = -1;
    ++x&& ++y || ++z;//本以为会与短路的,但结果非我所想
    printf("%d %d %d\n", x, y, z);
    x = y = z = -2;
    ++x|| ++y && ++z;
    printf("%d %d %d\n", x, y, z);

    return 0;
}

口算结果是:
0 -1 -1
-1 -2 -2
编译器结果:
0 -1 0
-1 -2 -2

&&和||的短路特性。
逻辑运算的工作原理是:

表达式A && 表达式B :
如果A的值为假就返回A的值并且不执行表达式B,否则执行表达式B并且返回B的值

表达式A || 表达式B :
如果A的值为真就返回A的值并且不执行表达式B,否则执行表达式B并且返回B的值


因为&&的优先级高于||
++x && ++y || ++z; 等于 (++x && ++y) || ++z;
是先判断++x && ++y
++x是0,0为假 返回0 不执行 ++y
之后判断 0 || ++z;
0为假 执行 ++z
所以只有++y被短路跳过不执行


第二个
++x || ++y && ++z; 等于 ++x || (++y && ++z);
++x是-1,-1为真 后面的++y && ++z就都不执行了

++x 和 x = x+1 的逻辑不一样的,x++最终是x的布尔值 ,x = x+1,是表达式的布尔值,赋值表达式的布尔值固定为1,题意的x = -1 ,++x ,x最终为零了,也就是x布尔值是零 ,&&,|| 是对两个布尔值操作,而且优先级相同,因此++x&&++y之后的布尔值为后面 || ++z 的操作数,即 ++x ,x为零,++y被短路,++x&&++y的布尔值为0,||++z,或没有被短路,最终结果: x = 0 ,y = -1 ,z = 0 .依次同理。最后&&的结合性优于||