#include "stdio.h" main() { int x,y,z; x=y=1; z=x++,y++,++y; printf("%d,%d,%d\n",x,y,z); }

答案的结果为什么是2,3,1啊?
求高手相助。。。给您在此谢过了~

#include "stdio.h"
main()
{
int x,y,z;
x=y=1;
z=x++,y++,++y;
printf("%d,%d,%d\n",x,y,z); }
其中x++是表明在执行完z=x后x才会自动加一,z=x++这条语句执行完后z=1,x=2
y++也是在这条语句结束后才会加一,这时y=2;
++y,是在这条语句执行前y自动加一,这时y=3
所以结果会是2,3,1
给你举一个例子:
int a=b=0;
a=++b;因为++b是在这条语句执行前先自动加一,所以这条语句结束后a=1,b=1
a=b++;上面a和b都=1了,这条语句执行后执行b++,所以这条语句结束后a=1,b=2追问

我把那个z=x++,y++,++y;看成一个逗号表达式了,这行怎么看啊?

追答

我认为这个就像int a=0,b,c 一样,你只把0赋值给a了,后面的只是定义。
z=x++,y++,++y这条语句只是把x++赋值给z,其他的依旧运算而已。不过这也只是我认为的,我也没有编过这样的程序,一般中间都会用分号隔开。。。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-07-13
原因就是运算符优先级的问题,就像楼上说的:逗号运算符的级别最低,比等号还低
所以这个语句:z=x++,y++,++y;实际上等于:(z=x++),(y++),(++y);这样写的话相信楼主就知道为什么z=1了吧
楼主认为z应该是3的原因应该是把z=x++,y++,++y;当成z=(x++,y++,++y);了
第2个回答  2011-07-12

int x,y,x; /* 初始化三个整形变量 */
x=y=1; /* 对x,y赋值 为1 */
z=x++; /* z=x++ 给z赋值为x的值1,然后x自加1,x变为2,*/
y++; /*y++ 等价与 y=y+1,所以y自加1,*/
++y; /*++y又自加1,最后y值为3 */
printf(" %d,%d,%d ",x,y,z);

最后补充 z=x++;y++;++y;之间要用分号,用逗号是语法错误!!!!!!!!
第3个回答  2011-07-12
反汇编过程如下:
0040106E mov dword ptr [y],1
00401075 mov eax,dword ptr [y]
00401078 mov dword ptr [x],eax
0040107B mov ecx,dword ptr [x]
0040107E mov dword ptr [z],ecx
00401081 mov edx,dword ptr [x]
00401084 add edx,1
00401087 mov dword ptr [x],edx
0040108A mov eax,dword ptr [y]
0040108D add eax,1
00401090 mov dword ptr [y],eax
00401093 mov ecx,dword ptr [y]
00401096 add ecx,1
00401099 mov dword ptr [y],ecx
1、逗号分隔表达式,赋值符号的优先级高于逗号。
2、可以看到逗号分隔的语句,只是从左到右执行。并不是像函数参数那样从右到左压栈。
第4个回答  2011-07-12
x=y=1;//x=1 y=1
z=x++,y++,++y//语言z=1(x=1),y=1+1,y=1+2
虽然是x++ 但是如果是++x的话 y=2了
所以x=2,y=3,z=1

...x,y,z; x=y=1; z=x++,y++,++y; printf("%d,%d,%d\\n",x,y,z); }...
include "stdio.h"main(){ int x,y,z;x=y=1;z=x++,y++,++y;printf("%d,%d,%d\\n",x,y,z); } 其中x++是表明在执行完z=x后x才会自动加一,z=x++这条语句执行完后z=1,x=2 y++也是在这条语句结束后才会加一,这时y=2;++y,是在这条语句执行前y自动加一,这时y=3 所以结果...

...{ int x,y,z; x=y=1;z=x++,y++,++y; printf ("%d%d%d",x,y,z...
所以这个语句:z=x++,y++,++y;实际上等于:(z=x++),(y++),(++y);这样写的话相信楼主就知道为什么z=1了吧 楼主认为z应该是3的原因应该是把z=x++,y++,++y;当成z=(x++,y++,++y);了

...main() { int x,y,z;x=y=1;z=(++x)+(++y)+(x++);printf("%d,%d,%d...
原式相当于z=n1+n2+n3 先执行n1=++x 执行后,x=2,n1=2 再执行n2=++y 执行后,y=2,n2=2 然后是n3=x++ 执行后,n3=2,x=3 最后为z=2+2+2 得z=6

...#include<stdio.h> main() {int x,y,z; x=y=1; z=(++x)+(++y)+...
我们拆开写,++x此时x=2 ++y此时y=2 x++运行时这个表达式已经是2了,运行结束后x=3 所以z = 2 + 2 + 2 = 6 所以结果是3,2,6

...void main( ) { int x,y,z; x=y=1; z=x++,y++; printf("%d,%d...
开始的时候x=1 y=1 然后z=x,x进行自加1,也就是此时的x=2 再过来y自加1,即y=2 最后把x、y的结果以十进制的形式打印出来,即 2,2

#include "conio.h"
include "stdio.h" \/\/头文件 main() \/\/主函数 {int x,y,z; \/\/定义x y z 三个整形变量 x=y=1; \/\/给x y 赋值为1 z=x++,y++,++y; \/\/这个是逗号表达式,按照运算符优先级来运算,自加运算符优先级最高,先进行运算,由于后加要先进行运算再自加1,所以先算”++y...

#include<stdio.h> int main() { int x=1,y; y=++x*++x; printf("x=...
1,这是因为c99 标准没对一个语句中两个自增做规定,一条语句中两个自增在不同编译器编译结果不同。2, 编译器通常把同一变量放于某一通用寄存器,再把运算结果放于另一寄存器, 在这里显然是x再做了两次自增后放于一个寄存器,然后对其取平方的。

...x=10;int y=x++;printf("%d,%d",(++y,y--),++y);}为什么答案是12,12...
简单啊,y=x++这一句话就实现了x=11然后才把结果给y,所以y也是11了,后面这个输出函数最后那里是先运行++y然后才运行前面那个()里面的东西,就是12了,别看输出的是12.12但是内存中变量x的真实值还是11哦。希望采纳

c语言问题: {int x,y,z; x=y=1; z=x++;y=z++,x=y++; printf("%d%d%d\\n...
x=y=1; 使得变量x和y的内容都为1 z=x++; 表达式的计算结果使z的内容为x的初始值,即z的内容为1, 同时x的内容变为2 y=z++; 表达式的计算结果使y的内容为z的初始值,即y的内容为1,同时z的内容变为2 x=y++;表达式的计算结果使x的内容为y的初始值,即x的内容为1,同时y的...

...int main() { int x,y,z,t; x=y=z=1; t=++x||++y&&++z; printf...
include <stdio.h>int main(){int x,y,z,t;x=y=z=1;t=++x||++y&&++z;printf("x=%d y=%d z=%d t=%d\\n",x,y,z,t);return 0;}运行结果:x=2 y=1 z=1 t=1 你说t是怎么算的?你呢应该是迷糊t=++x||++y&&++z;这个表达式是吧 好 你要搞清楚这个问题你就得知道运算符...

相似回答