以下c如何输出垃圾?

How the following c outputs garbage?

#include <stdio.h>

int main(void) {
   int d, a = 1 & 0 && (d=4);
   printf("%d\n", d);
   return 0;
}

根据运算符优先级()语句d应该被赋值但是在上面的程序中符合逻辑并且先执行。 d 值未分配给 4。请任何人帮助我理解上述程序。我试过 gcc 和一些在线编译器

  • 1 & 0 && (d=4) 是这样计算的:(1 & 0) && (d=4)
  • (1 & 0) 是 0
  • 因为 && 运算符的右侧未被计算
  • 因此 d=4 永远不会被评估
  • 因此 d 永远不会被分配
  • 因此 d 包含垃圾,因为局部变量未初始化

如果将 int d 更改为 int d = 42,程序的输出将是 42

先来看f() + g() * h()

优先级和结合性定义了什么是什么的操作数。例如, C operator precedence and associativity 告诉我们

f() + g() * h()

表示

f() + ( g() * h() )     # * has higher precedence than +

而不是

( f() + g() ) * h()     # If + had higher precedence than *

值得注意的是,优先级不决定操作数的计算顺序。在我们的示例中,可以以任何顺序调用这三个函数,只要g()h() 的结果相乘,乘法的结果与 f() 的结果相加。


返回

1 & 0 && ( d = 4 )

优先级和结合律简单地告诉我们上面的等价于下面的:

( 1 & 0 ) && ( d = 4 )    # & has higher precedence than &&

这有什么作用?

&& 表示仅当其左侧为真时才评估其右侧。这称为 short-circuit evaluation 或短路。

1 & 0 为假,因此 d = 4 永远不会被评估。这使 d 保持不变,因此未初始化。