#include <stdio.h>
int main(void)
{
int a = 0, b = 1;
a = (a = 5) && (b = 0);
printf("%d", a);
printf("%d", b);
}
Run Code Online (Sandbox Code Playgroud)
变量的值a被更新两次,这违反了 C 标准。所以我认为这将取决于编译器。我在很多在线 C 编译器中运行了这段代码,所有编译器都给出了相同的输出。
由于&&操作符引入的序列点,该代码的行为被明确定义。C 标准第 6.5.13p4 节中关于逻辑 AND 运算符对此进行了详细说明&&:
与按位二元运算符不同
&,该&&运算符保证从左到右求值;如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在序列点。如果第一个操作数比较等于 0,则不计算第二个操作数。
浏览一下代码:
a = (a = 5) && (b = 0);
Run Code Online (Sandbox Code Playgroud)
首先评估运算符的左侧&&ie ,其设置为 5。其评估结果为 true,因此在评估右侧 ie 之前有一个序列点。这设置为 0 并求值为 false,因此该运算符的结果是值 0。然后将该值分配给。(a = 5)a(b = 0)b&&a