C语言逻辑运算问题求大佬答疑

#include <stdio.h>
int main()
{
    int a = 0; 
    printf("%d\n", !a && ++a );
    printf("%d\n", !a);
    return 0;
}

这一串代码定义了a =0 ,!a 是真值,++a也是真值,第一个printf打印的是1没问题。

因为++a,a 就变成了 1,第二个printf 打印的是0,没问题。

那么看第二段代码

#include <stdio.h>
int main()
{
    int a = 0; 
    printf("%d\n", !a || ++a );
    printf("%d\n", !a);
    return 0;
}

这里第二个printf为什么打印的会是1呢?

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


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


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


a 是0, !a结果是1 , 1为真就直接返回输出这个1, ||右边的 ++a 不会执行了 
第二个 printf("%d\n", !a); 时a还是0, !a结果依然是1

!a || ++a 这个语句如果!a返回是true,++a就不会执行了,所以a的值还是0,所以结果是1

请采纳,谢谢!

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y