#include <stdio.h>
int main()
{
int x = 2, y = 0;
int m = (y |= 10);
int z = y && m;
printf("%d\n", z);
return 0;
}
上面的程序给我的输出为1。下面的代码给我的输出为0,但是这里不同的输出是什么原因?
#include <stdio.h>
int main()
{
int x = 2, y = 0;
int z = y && (y |= 10);
printf("%d\n", z);
return 0;
}
答案 0 :(得分:1)
在
y
10
被10
屏蔽,因此设置为y && m
,所以1
是布尔值y
,因为m
和{{ 1}}非零,已分配给z
现在,在
int z = y && (y |= 10);
y == 0
,这样&&
短路,而不是评估右侧部分并且不更改y
的值。因此,z
设置为0。
您曾经使用过:
int z = y & (y |= 10);
这将取决于编译器对操作数进行评估的方式/顺序(实现定义的行为以获取0
或10
)
请注意,如果第一个参数为零,&&
短路不会评估第二个参数。有充分的理由:
if ((pointer != NULL) && pointer->value == 12) { do_something(); }
此条件检查该值是否为12,但如果指针为非NULL,则仅检查 。如果首先对第二个表达式求值,则可能会崩溃。