C 一行代码中单个变量的多重赋值
有人能告诉我这个代码是怎么工作的吗C 一行代码中单个变量的多重赋值,c,C,有人能告诉我这个代码是怎么工作的吗 #include <stdio.h> void main() { int m,k; m=(k=5) + (k=8) + (k=9) + (k=7); printf ("%d\n", m); } // output 32 #包括 void main(){ int m,k; m=(k=5)+(k=8)+(k=9)+(k=7); printf(“%d\n”,m); }//输出32 当我在编译器中运行此
#include <stdio.h>
void main() {
int m,k;
m=(k=5) + (k=8) + (k=9) + (k=7);
printf ("%d\n", m);
} // output 32
#包括
void main(){
int m,k;
m=(k=5)+(k=8)+(k=9)+(k=7);
printf(“%d\n”,m);
}//输出32
当我在编译器中运行此代码时,输出为32
不知道为什么。此代码调用未定义的行为-任何结果都是可疑的,即使它是您期望的结果 在没有序列点的表达式中多次尝试修改对象(或修改对象并在值计算中使用它)会导致未定义的行为。对
k
的多个赋值是一个问题。问题是,算术表达式不必从左到右求值——每个项都可以按任意顺序求值。此外,评估后不必立即应用副作用
您得到的任何结果都是意外的结果,而不是设计的结果。您的代码通过在一条语句中多次赋值给同一变量来调用未定义的行为,这意味着任何事情都可能发生。Re“尝试多次修改对象(或修改对象并在值计算中使用它)在没有序列点的表达式中,会导致未定义的行为“:这将使
k=k+1
未定义,但事实并非如此。。。一个小小的请求你可以试试:m=(k=5)+(k=8);//输出16M=(k=8)+(k=5);//输出10而不是m=(k=5)+(k=8)+(k=9)+(k=7);-->这是k最后一个值的两倍。@ApoorvPathak:同样,这些表达式会导致未定义的行为-对k
的多次更新是问题所在<代码>m=5+8或m=5+8+9+7
将起作用。甚至像m=(a=5)+(b=8)+(c=9)+(d=7)
这样的东西也会像预期的那样工作,因为在没有序列点的情况下不会多次更新同一对象。但是多次更新k
会导致编译器生成给出未定义结果的代码,其中“未定义”只是意味着编译器不需要以任何特定方式处理这种情况。@JohnBode谢谢