逗号运算符中复合自增运算符的运算

发布时间:2024-05-18 22:31 发布:上海旅游网

问题描述:

拿个很简单的例子来说
int x=3,a=3,b=0;
b=(x,(x++)+(++x)+(++x))
printf("%d %d %d\n",a,b,x);
输出为:3 15 6

但是问题来了,逗号运算符第一个出现赋值符号
int x=3,a=3,b=0;
b=(x=a,(x++)+(++x)+(++x))
printf("%d %d %d\n",a,b,x);
结果就是:3 13 6

甚至
int x=3,a=3,b=0;
b=(b=a,(x++)+(++x)+(++x))
printf("%d %d %d\n",a,b,x);
这样的程序,结果也是:3 13 6
为什么呢?
第二行我疏忽了,丢了个分号~~不过没影响
别直接说按结合率啊之类的东西,如果真那么简单我也不会来问了,请认真算过再给我答案
结果方面我很费解,我认为要么应该是3 15 6,要么应该是3 14 6(类似printf("%d",(x++)+(++x)+(++x)))
但是这个结果是调试出来的,所以结果方面没问题,就是找不出怎么计算的

谢谢提供汇编的,能注释一下吗?没怎么接触

问题解答:

这种东西就是结合率吧,看是靠那边结合

看汇编代码后将一目了然

第1种:
0040103D mov eax,dword ptr [ebp-4]
00401040 add eax,1
00401043 mov dword ptr [ebp-4],eax
00401046 mov ecx,dword ptr [ebp-4]
00401049 add ecx,dword ptr [ebp-4]
0040104C mov edx,dword ptr [ebp-4]
0040104F add edx,1
00401052 mov dword ptr [ebp-4],edx
00401055 add ecx,dword ptr [ebp-4]
00401058 mov dword ptr [ebp-0Ch],ecx
0040105B mov eax,dword ptr [ebp-4]
0040105E add eax,1
00401061 mov dword ptr [ebp-4],eax
7: printf("%d %d %d\n",a,b,x);
00401064 mov ecx,dword ptr [ebp-4]
00401067 push ecx
00401068 mov edx,dword ptr [ebp-0Ch]
0040106B push edx
0040106C mov eax,dword ptr [ebp-8]
0040106F push eax
00401070 push offset string "%d %d %d\n" (0042001c)
00401075 call printf (004010c0)
0040107A add esp,10h

第2种:
0040103D mov eax,dword ptr [ebp-8]
00401040 mov dword ptr [ebp-4],eax
00401043 mov ecx,dword ptr [ebp-4]
00401046 add ecx,1
00401049 mov dword ptr [ebp-4],ecx
0040104C mov edx,dword ptr [ebp-4]
0040104F add edx,dword ptr [ebp-4]
00401052 mov eax,dword ptr [ebp-4]
00401055 add eax,1
00401058 mov dword ptr [ebp-4],eax
0040105B add edx,dword ptr [ebp-4]
0040105E mov dword ptr [ebp-0Ch],edx
00401061 mov ecx,dword ptr [ebp-4]
00401064 add ecx,1
00401067 mov dword ptr [ebp-4],ecx
7: printf("%d %d %d\n",a,b,x);
0040106A mov edx,dword ptr [ebp-4]
0040106D push edx
0040106E mov eax,dword ptr [ebp-0Ch]
00401071 push eax
00401072 mov ecx,dword ptr [ebp-8]
00401075 push ecx
00401076 push offset string "%d %d %d\n" (0042001c)
0040107B call printf (004010c0)
00401080 add esp,10h

第3种:
0040103D mov eax,dword ptr [ebp-8]
00401040 mov dword ptr [ebp-0Ch],eax
00401043 mov ecx,dword ptr [ebp-4]
00401046 add ecx,1
00401049 mov dword ptr [ebp-4],ecx
0040104C mov edx,dword ptr [ebp-4]
0040104F add edx,dword ptr [ebp-4]
00401052 mov eax,dword ptr [ebp-4]
00401055 add eax,1
00401058 mov dword ptr [ebp-4],eax
0040105B add edx,dword ptr [ebp-4]
0040105E mov dword ptr [ebp-0Ch],edx
00401061 mov ecx,dword ptr [ebp-4]
00401064 add ecx,1
00401067 mov dword ptr [ebp-4],ecx
7: printf("%d %d %d\n",a,b,x);
0040106A mov edx,dword ptr [ebp-4]
0040106D push edx
0040106E mov eax,dword ptr [ebp-0Ch]
00401071 push eax
00401072 mov ecx,dword ptr [ebp-8]
00401075 push ecx
00401076 push offset string "%d %d %d\n" (0042001c)
0040107B call printf (004010c0)
00401080 add esp,10h

首先你程序第二行是不是少个分号
其次结果我认为都是3 15 6 你最好确认一下

想了半天也没想出来 都好运算符就是右操作的 第一种好解释 后面的却好似离谱 对不住 帮不上忙 我也郁闷

热点新闻