以下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
保持不变,因此未初始化。
#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
保持不变,因此未初始化。