首页 新闻 会员 周边 捐助

有关c语言问题

0
悬赏园豆:10 [已解决问题] 解决于 2021-11-06 15:14

include <stdio.h>

int main()
{
int i = 8;
printf("%d\n%d\n%d\n%d\n%d\n%d\n", ++i, --i, i++, i--, -i++ , -i--); // 输出结果怎么不是
// i=9
// i=8
// i=8
//i=8
// i= -8
// i = -9

return 0;

}

上心&的主页 上心& | 初学一级 | 园豆:131
提问于:2021-11-01 22:53
< >
分享
最佳答案
0

这应该和参数的栈顺序有关吧
++和--运算的执行从最后一个开始执行

收获园豆:10
计算机知识杂谈 | 菜鸟二级 |园豆:470 | 2021-11-02 07:52

首先我这边环境的输出是
8
8
7
8
-7
-8

按照++和--的执行顺序,从最后一个开始,-i--就是-8,然后i变为7
然后-i++就是-7,因为++是后置的,然后i再变为8,以此类推。

最终输出时,把那些-8,-7等数字,从前往后再输出,就是你看到的结果了。

计算机知识杂谈 | 园豆:470 (菜鸟二级) | 2021-11-02 07:54

函数的参数存储在栈内,一般的C调用顺序(应该也不能说一般吧),把参数从后往前放入栈中,因此从后往前计算++或--。

计算机知识杂谈 | 园豆:470 (菜鸟二级) | 2021-11-02 07:56

补充,printf在库的定义,参数的压栈顺序是cdecl
因此从后向前

计算机知识杂谈 | 园豆:470 (菜鸟二级) | 2021-11-02 21:40
其他回答(2)
1

看汇编,你就明白为什么。

#include <stdio.h>

int main()
{
00401060  push        ebp  
00401061  mov         ebp,esp  
00401063  sub         esp,54h  
00401066  push        ebx  
00401067  push        esi  
00401068  push        edi  
	int i = 8;
00401069  mov         dword ptr [i],8  
	printf("%d\n%d\n%d\n%d\n%d\n%d\n", ++i, --i, i++, i--, -i++, -i--); 
00401070  mov         eax,dword ptr [i]  
00401073  neg         eax  
00401075  mov         dword ptr [ebp-48h],eax  
00401078  mov         ecx,dword ptr [i]  
0040107B  neg         ecx  
0040107D  mov         dword ptr [ebp-4Ch],ecx  
00401080  mov         edx,dword ptr [i]  
00401083  mov         dword ptr [ebp-50h],edx  
00401086  mov         eax,dword ptr [i]  
00401089  mov         dword ptr [ebp-54h],eax  
0040108C  mov         ecx,dword ptr [i]  
0040108F  sub         ecx,1  
00401092  mov         dword ptr [i],ecx  
00401095  mov         edx,dword ptr [i]  
00401098  add         edx,1  
0040109B  mov         dword ptr [i],edx  
0040109E  mov         eax,dword ptr [ebp-48h]  
004010A1  push        eax  
004010A2  mov         ecx,dword ptr [ebp-4Ch]  
004010A5  push        ecx  
004010A6  mov         edx,dword ptr [ebp-50h]  
004010A9  push        edx  
004010AA  mov         eax,dword ptr [ebp-54h]  
004010AD  push        eax  
004010AE  mov         ecx,dword ptr [i]  
004010B1  push        ecx  
004010B2  mov         edx,dword ptr [i]  
004010B5  push        edx  
004010B6  push        offset string "%d\n%d\n%d\n%d\n%d\n%d\n" (0403100h)  
004010BB  call        printf (04010F0h)  
004010C0  add         esp,1Ch  
004010C3  mov         eax,dword ptr [i]  
004010C6  add         eax,1  
004010C9  mov         dword ptr [i],eax  
004010CC  mov         ecx,dword ptr [i]  
004010CF  sub         ecx,1  
004010D2  mov         dword ptr [i],ecx  
004010D5  mov         edx,dword ptr [i]  
004010D8  add         edx,1  
004010DB  mov         dword ptr [i],edx  
004010DE  mov         eax,dword ptr [i]  
004010E1  sub         eax,1  
004010E4  mov         dword ptr [i],eax  
	return 0;
004010E7  xor         eax,eax  
}
004010E9  pop         edi  
004010EA  pop         esi  
004010EB  pop         ebx  
004010EC  mov         esp,ebp  
004010EE  pop         ebp  
004010EF  ret  
寂静的羽夏 | 园豆:2095 (老鸟四级) | 2021-11-01 23:06
0
  1. 上面说的对
  2. 不要这么写,保证一次只有一个++ --
Smalldy | 园豆:496 (菜鸟二级) | 2021-11-02 20:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册