繁体   English   中英

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

[英]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);
}

输出:m=32 k=7

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

简化解释:

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

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

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

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

这里有标准参考的详细解释:为什么我们不能将像 i++ 这样的增量运算符与其他运算符混合使用?

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

警告:对“k”的多个未排序的修改 [-Wunsequenced]

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

程序的行为是未定义的。

表达式中的k上有多个未排序的写入

(k = 5) + (k = 8) + (k = 9) + (k = 7)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM