ljy5011 发表于 2022-2-20 22:43:23

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

wp231957 发表于 2022-2-21 07:28:31

走火入魔了,没人告诉你研究这些东西就是浪费时间吗

jhq999 发表于 2022-2-21 07:31:07

本帖最后由 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,做为前两个参数的值

大马强 发表于 2022-2-21 09:44:27

好像自增和自减的顺序和编译器有关,每个编译器的处理顺序有些许不一样

jhq999 发表于 2022-2-21 10:26:05

引用楼上,所以这样的问题只是浪费时间,为了少出BUG,莫装逼,分解成单步,或者多声明点变量

ljy5011 发表于 2022-2-23 10:56:24

jhq999 发表于 2022-2-21 10:26
引用楼上,所以这样的问题只是浪费时间,为了少出BUG,莫装逼,分解成单步,或者多声明点变量

没有 主要做题看到这种题,看不懂

jhq999 发表于 2022-2-23 11:11:57

ljy5011 发表于 2022-2-23 10:56
没有 主要做题看到这种题,看不懂

所以要现实中尽量单步,或者多声明变量来实现,因为有时编译器不一样,出来的结果也不一样,了解就好不要钻牛角尖,这种题我理解就是让你知道,函数参数的顺序从右到左
页: [1]
查看完整版本: c语言自增自减问题