以下c语言如何输出垃圾?

问题描述 投票:0回答:1
int main() {
   int d,a = 1&0&&(d=4);
   printf(“%d”,d);
   return 0;
}

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

c operator-precedence
1个回答
0
投票
  • 1 & 0 && (d=4)的评估如下:(1 & 0) && (d=4)
  • (1 & 0)为0
  • 由于short circuiting运算符的右侧未被评估
  • 因此&&从不评估
  • 因此d=4从未分配
  • 因此d包含垃圾,因为未初始化局部变量

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


0
投票

让我们先看看42。>>

优先级和关联性决定什么是什么的操作数。例如,他们告诉我们

f() + g() * h()

手段

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 && 指示仅在其左侧为true时才评估其右侧。这称为“ &&”或“短路”。

[shift-circuit evaluation为假,因此从不评估1 & 0

© www.soinside.com 2019 - 2024. All rights reserved.