该 C 代码的输出与编译器相关吗?

SUB*_*AUL 4 c sequence-points

#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 编译器中运行了这段代码,所有编译器都给出了相同的输出。

dbu*_*ush 8

由于&&操作符引入的序列点,该代码的行为被明确定义。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

  • 它必须是一个序列点,因为必须首先评估左侧才能决定是否评估右侧 - 这称为短路。 (5认同)
  • @IanAbbott——对规范的引用可能会有所帮助:[...`&amp;&amp;` 运算符保证从左到右的评估;如果计算第二个操作数,则第一个和第二个操作数的计算之间存在一个序列点。](http://port70.net/~nsz/c/c11/n1570.html#6.5.13) (3认同)