#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;实际上等于:(z=x++),(y++),(++y);这样写的话相信楼主就知道为什么z=1了吧
楼主认为z应该是3的原因应该是把z=x++,y++,++y;当成z=(x++,y++,++y);了
{
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;之间要用分号,用逗号是语法错误!!!!!!!!
反汇编过程如下:
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、可以看到逗号分隔的语句,只是从左到右执行。并不是像函数参数那样从右到左压栈。
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