搞不懂为啥等于5 然后改了这两处 为啥第0位是2 还有如果没改之前(++p)不就等于5了吗再指向next不就没了吗

img

img

简单来说就是c语言中传参顺序是先传后面的参数,再传前面的参数。导致你的程序先计算了(++p)->next->a*3,再计算的++p->a。如果参数变为("%d,%d",++p->a,++p->a)你就会发现,第一个数比第二个数小1
但是,注意了,如果++操作后面是一个非结构体成员的变量,结果又会不一样。如int a=0; printf("%d,%d",++a,++a); 这里的结果会是(2,2)
看了下反汇编,时间原因没能总结出为什么会这样,汇编代码放下面,有能力的大神可以总结总结。搞清楚原理之前先不要在参数里同时放两个++x操作吧。x++我试了下,确定是按照先计算后面的参数再计算前面的参数来执行的。
printf("%d,%d\n", ++p->a, (++p)->next->a * 3);
00295452 mov eax,dword ptr [p]
00295455 add eax,8
00295458 mov dword ptr [p],eax
0029545B mov ecx,dword ptr [p]
0029545E mov edx,dword ptr [ecx]
00295460 add edx,1
00295463 mov dword ptr [ebp-0F4h],edx
00295469 mov eax,dword ptr [p]
0029546C mov ecx,dword ptr [ebp-0F4h]
00295472 mov dword ptr [eax],ecx
00295474 mov edx,dword ptr [p]
00295477 mov eax,dword ptr [edx+4]
0029547A imul ecx,dword ptr [eax],3
0029547D push ecx
0029547E mov edx,dword ptr [ebp-0F4h]
00295484 push edx
00295485 push offset string "%d,%d\n" (0297B34h)
0029548A call _printf (02910CDh)
0029548F add esp,0Ch
p = s;
00295492 mov dword ptr [p],offset s (029A150h)
fun(++p->a, ++p->a);
00295499 mov eax,dword ptr [p]
0029549C mov ecx,dword ptr [eax]
0029549E add ecx,1
002954A1 mov dword ptr [ebp-0F4h],ecx
002954A7 mov edx,dword ptr [p]
002954AA mov eax,dword ptr [ebp-0F4h]
002954B0 mov dword ptr [edx],eax
002954B2 mov ecx,dword ptr [p]
002954B5 mov edx,dword ptr [ecx]
002954B7 add edx,1
002954BA mov dword ptr [ebp-0F8h],edx
002954C0 mov eax,dword ptr [p]
002954C3 mov ecx,dword ptr [ebp-0F8h]
002954C9 mov dword ptr [eax],ecx
002954CB mov edx,dword ptr [ebp-0F4h]
002954D1 push edx
002954D2 mov eax,dword ptr [ebp-0F8h]
002954D8 push eax
002954D9 call fun (02912C1h)
002954DE add esp,8
fun(++a, ++a); //int a=0; 结果2,2
002954E1 mov eax,dword ptr [a]
002954E4 add eax,1
002954E7 mov dword ptr [a],eax
002954EA mov ecx,dword ptr [a]
002954ED add ecx,1
002954F0 mov dword ptr [a],ecx
002954F3 mov edx,dword ptr [a]
002954F6 push edx
002954F7 mov eax,dword ptr [a]
002954FA push eax
002954FB call fun (02912C1h)
00295500 add esp,8
fun(++*b, ++*b); //int *b=&a 结果4,4
00295503 mov eax,dword ptr [b]
00295506 mov ecx,dword ptr [eax]
00295508 add ecx,1
0029550B mov edx,dword ptr [b]
0029550E mov dword ptr [edx],ecx
00295510 mov eax,dword ptr [b]
00295513 mov ecx,dword ptr [eax]
00295515 add ecx,1
00295518 mov edx,dword ptr [b]
0029551B mov dword ptr [edx],ecx
0029551D mov eax,dword ptr [b]
00295520 mov ecx,dword ptr [eax]
00295522 push ecx
00295523 mov edx,dword ptr [b]
00295526 mov eax,dword ptr [edx]
00295528 push eax
00295529 call fun (02912C1h)
0029552E add esp,8