c语言自增自减问题
#include <stdio.h>int main()
{
int m = 8;
printf("%d\n%d\n%d\n%d\n", ++m, --m, m++, m--);
system("pause");
}
结果是 8 8 7 8 我想的结果是8 7 78 也就是中间那个--m 那块不明白为什么是8 而不是--8 等于7 走火入魔了,没人告诉你研究这些东西就是浪费时间吗 本帖最后由 jhq999 于 2022-2-21 08:17 编辑
5: printf("%d\n%d\n%d\n%d\n", ++m, --m, m++, m--);
00A81B75 8B 45 F8 mov eax,dword ptr
00A81B78 89 85 30 FF FF FF mov dword ptr ,eax;dword ptr =8
00A81B7E 8B 4D F8 mov ecx,dword ptr
00A81B81 83 E9 01 sub ecx,1
00A81B84 89 4D F8 mov dword ptr ,ecx
00A81B87 8B 55 F8 mov edx,dword ptr
00A81B8A 89 95 2C FF FF FF mov dword ptr ,edx ; dword ptr =7
00A81B90 8B 45 F8 mov eax,dword ptr
00A81B93 83 C0 01 add eax,1
00A81B96 89 45 F8 mov dword ptr ,eax ;dword ptr =8
00A81B99 8B 4D F8 mov ecx,dword ptr
00A81B9C 83 E9 01 sub ecx,1
00A81B9F 89 4D F8 mov dword ptr ,ecx ;dword ptr =7
00A81BA2 8B 55 F8 mov edx,dword ptr
00A81BA5 83 C2 01 add edx,1
00A81BA8 89 55 F8 mov dword ptr ,edx ; dword ptr =8
00A81BAB 8B F4 mov esi,esp
00A81BAD 8B 85 30 FF FF FF mov eax,dword ptr
00A81BB3 50 push eax ;压入8
00A81BB4 8B 8D 2C FF FF FF mov ecx,dword ptr
00A81BBA 51 push ecx ;压入7
00A81BBB 8B 55 F8 mov edx,dword ptr
00A81BBE 52 push edx ;压入8
00A81BBF 8B 45 F8 mov eax,dword ptr
00A81BC2 50 push eax ;压入8
00A81BC3 68 58 88 A8 00 push 0A88858h
00A81BC8 FF 15 4C C3 A8 00 call dword ptr ds:
作为参数从右向左,遇到后缀自增自减先把m值存储起来后自增自减,所以后两个参数是8和7,遇到前缀自增自减先自增自减直到最后把m值做参数传入函数,所以7+1,8-1,7+1,最后m=8,做为前两个参数的值 好像自增和自减的顺序和编译器有关,每个编译器的处理顺序有些许不一样 引用楼上,所以这样的问题只是浪费时间,为了少出BUG,莫装逼,分解成单步,或者多声明点变量 jhq999 发表于 2022-2-21 10:26
引用楼上,所以这样的问题只是浪费时间,为了少出BUG,莫装逼,分解成单步,或者多声明点变量
没有 主要做题看到这种题,看不懂 ljy5011 发表于 2022-2-23 10:56
没有 主要做题看到这种题,看不懂
所以要现实中尽量单步,或者多声明变量来实现,因为有时编译器不一样,出来的结果也不一样,了解就好不要钻牛角尖,这种题我理解就是让你知道,函数参数的顺序从右到左
页:
[1]