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值),右边同样会被短路,不执行。
回到代码里具体看:
- 首先执行
printf("a"),它成功输出了1个字符,所以返回值是1(非0,属于「真」)。 - 因为
||左边已经是真了,右边的(printf("b") && printf("c"))直接被跳过,根本不会执行。
所以最终只有printf("a")被执行,输出自然只有'a'。
举个反例验证一下:如果把printf("a")改成printf("")(返回0,假),这时候||会去计算右边的&&表达式,先执行printf("b")(返回1),然后因为&&左边为真,继续执行printf("c"),这时候就会输出"bc"了。
内容的提问来源于stack exchange,提问作者SuspectBloom993




