You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C语言逻辑与(&&)、逻辑或(||)运算符混淆行为及代码疑问

为什么这段C代码只输出'a'?

咱们先把问题里的代码贴出来,方便一步步拆解分析:

#include<stdio.h>
int main(){
    int a = printf("a")||printf("b")&&printf("c");
    return 0;
}

你提到&&优先级高于||,这点完全没错——编译器会把这个表达式解析成:
printf("a") || (printf("b") && printf("c"))

但真正决定输出结果的,是C语言逻辑运算符的**短路求值(Short-circuit Evaluation)**特性,这也是很多人容易忽略的核心点:

  • 对于逻辑或||:只要左边的表达式结果为「真」(非0值),右边的表达式就会被直接跳过,完全不执行。因为逻辑或只要有一个操作数为真,整个表达式的结果就已经确定为真了,没必要再计算右边。
  • 对于逻辑与&&:如果左边表达式为「假」(0值),右边同样会被短路,不执行。

回到代码里具体看:

  1. 首先执行printf("a"),它成功输出了1个字符,所以返回值是1(非0,属于「真」)。
  2. 因为||左边已经是真了,右边的(printf("b") && printf("c"))直接被跳过,根本不会执行。

所以最终只有printf("a")被执行,输出自然只有'a'。

举个反例验证一下:如果把printf("a")改成printf("")(返回0,假),这时候||会去计算右边的&&表达式,先执行printf("b")(返回1),然后因为&&左边为真,继续执行printf("c"),这时候就会输出"bc"了。

内容的提问来源于stack exchange,提问作者SuspectBloom993

火山引擎 最新活动