有人可以解释一下为什么我为以下代码得到两个不同的答案吗?

时间:2019-10-12 10:16:55

标签: c

#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;
}

1 个答案:

答案 0 :(得分:1)

y

1010屏蔽,因此设置为y && m,所以1是布尔值y,因为m和{{ 1}}非零,已分配给z

现在,在

int z = y && (y |= 10);

y == 0,这样&& 短路,而不是评估右侧部分并且不更改y的值。因此,z设置为0。

您曾经使用过:

int z = y & (y |= 10);

这将取决于编译器对操作数进行评估的方式/顺序(实现定义的行为以获取010

请注意,如果第一个参数为零,&&短路不会评估第二个参数。有充分的理由

if ((pointer != NULL) && pointer->value == 12) { do_something(); }

此条件检查该值是否为12,但如果指针为非NULL,则仅检查 。如果首先对第二个表达式求值,则可能会崩溃。