这个问题在这里已有答案:
#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
。
在表达式y&(y=2)
中,您既可以读取也可以写y
,而不需要它们之间的序列点。这样做会调用undefined behavior。这意味着无法准确预测程序的行为,因此没有答案是“正确的”。
您遇到的是未定义行为的经典案例。 C标准没有对&
的子表达式的评估施加任何顺序。因此,无法知道y=2
是先发生还是y
(读)。
这也称为对同一变量的无序读写。
因为您已经调用了UB,所以除了这一点之外,您无法争论程序的行为。
当你做y=2
你做任务。您将值2
分配给y
。
另请注意,单个&
是按位的,而不是逻辑的。
如果你想比较平等,请使用==
中的y == 2
。
如果你想使用逻辑并使用&&
中的y && y == 2
。虽然这确实不需要,因为y
相当于y != 0
,并且已经在与2
的比较中隐含了。
如上所述,由于评估顺序没有定义,我们无法判断y
或y = 2
是否会先发生,这意味着y & (y = 2)
是undefined behavior。
y & (y = 2)
的行为未定义。那是因为在一个未经测试的步骤中对y
进行了读写。
如果你写y && (y = 2)
,那将是另一回事。 &&
是一个测序点,虽然2
到y
的分配只会在y
非零时发生(在你的情况下是这样)。
最后,1 & 2
是0
,而1 && 2
是1
;对那些喜欢用&
代替&&
强迫论据评价的人来说,这是一块试金石。