运行 这个有点奇怪的 c 代码后出现意外输出。谁能解释这是怎么发生的?

Unexpected output after running this little bit strange c code. Can anyone explain how this happened?

我正在尝试了解这段代码的工作原理,

int main () {
 int m, k;
 m = (k=5)+(k=8)+(k=9)+(k=7);
 printf("m=%d\n",m);
 printf("k=%d\n",k);
}

输出: 米=32 k=7

我不知道m的值是怎么变成32的。 我希望有人能帮助我理解这段代码是如何工作的以及输出是如何像这样结束的

程序的行为是未定义

表达式

k有多个无序写入
(k = 5) + (k = 8) + (k = 9) + (k = 7)

这是未定义的行为。您的编译器对此发出警告

warning: multiple unsequenced modifications to 'k' [-Wunsequenced]

您可以在此处了解更多信息:

简化说明:

当您在同一表达式中多次使用 k=... 时,对同一变量的所有赋值都是所谓的“未排序的副作用”。简单地说,这意味着 C 没有指定 + 到 evaluate/execute 的哪个操作数在前,也没有指定执行赋值的顺序。

所以编译器无法知道先从 k 到 evaluate/assign 哪个,因此会感到困惑。这就是所谓的“未定义行为”,任何事情都可能发生。

你必须通过将表达式分成几个部分来解决这个问题,每个部分用分号分隔,作为“序列点”,这意味着所有先前的评估都需要在 ; 遇到。示例:

k=5;
k+=8;
k+=9;
m = k + 7;

这里有标准参考的详细解释:Why can't we mix increment operators like i++ with other operators?