[英]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.