如果(y&(y = 2)那么如果条件如何处理[重复]

问题描述 投票:-3回答:4
#include <stdio.h>

int main() {
    int y = 1;
    if (y & (y = 2))
        printf("true %d\n",y);
    else
        printf("false %d\n",y);
    return 0;
}

输出如何作为true 2?根据我在if条件内,这将发生if( 1 & (2))但输出来自true 2

c if-statement bit-manipulation bitwise-operators
4个回答
4
投票

在表达式y&(y=2)中,您既可以读取也可以写y,而不需要它们之间的序列点。这样做会调用undefined behavior。这意味着无法准确预测程序的行为,因此没有答案是“正确的”。


3
投票

您遇到的是未定义行为的经典案例。 C标准没有对&的子表达式的评估施加任何顺序。因此,无法知道y=2是先发生还是y(读)。

这也称为对同一变量的无序读写。

因为您已经调用了UB,所以除了这一点之外,您无法争论程序的行为。


2
投票

当你做y=2你做任务。您将值2分配给y

另请注意,单个&是按位的,而不是逻辑的。

如果你想比较平等,请使用==中的y == 2

如果你想使用逻辑并使用&&中的y && y == 2。虽然这确实不需要,因为y相当于y != 0,并且已经在与2的比较中隐含了。


如上所述,由于评估顺序没有定义,我们无法判断yy = 2是否会先发生,这意味着y & (y = 2)undefined behavior


2
投票

y & (y = 2)的行为未定义。那是因为在一个未经测试的步骤中对y进行了读写。

如果你写y && (y = 2),那将是另一回事。 &&是一个测序点,虽然2y的分配只会在y非零时发生(在你的情况下是这样)。

最后,1 & 20,而1 && 21;对那些喜欢用&代替&&强迫论据评价的人来说,这是一块试金石。

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