鱼C论坛

 找回密码
 立即注册
查看: 3072|回复: 8

本题的详细求法,求详解

[复制链接]
发表于 2012-3-29 17:47:35 | 显示全部楼层 |阅读模式
1鱼币
#include <stdio.h>
void main()
{
int i = 8;
printf("%d\n",++i);
printf("%d\n",--i);
printf("%d\n",i++);
printf("%d\n",i--);
printf("%d\n",-i++);
printf("%d\n",-i--);
}
运行结果是:9
                     8
                     8
                     9
                   -8
                   -9

最佳答案

查看完整内容

还好你这是分开的 要是那种printf("++ -- -- ++")这种一堆一起的我还真不敢回答 #include void main() { int i = 8; printf("%d\n",++i); //++i 先加然后将值输出 这里i=9 printf("%d\n",--i); //--i 接上面的值i=9 先减运算i-1 然后输出值 这里i=8 printf("%d\n",i++); //i++ 接上面的值i=8 先输出结果i=8 再进行运算i+1 这里i=9 printf("%d\n",i--); //i-- 接上面的值i=9 先输出结果i=9 再进 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-29 17:47:36 | 显示全部楼层
本帖最后由 莫名其妙 于 2012-3-29 19:00 编辑

还好你这是分开的 要是那种printf("++  --  --  ++")这种一堆一起的我还真不敢回答
#include <stdio.h>
void main()
{
int i = 8;
printf("%d\n",++i);   //++i 先加然后将值输出  这里i=9
printf("%d\n",--i);   //--i 接上面的值i=9    先减运算i-1   然后输出值  这里i=8
printf("%d\n",i++);  //i++  接上面的值i=8   先输出结果i=8  再进行运算i+1  这里i=9
printf("%d\n",i--); //i--   接上面的值i=9   先输出结果i=9   再进行运算i-1  这里i=8
printf("%d\n",-i++);//-i++  接上面的值i=8   先进行负号运算 i=-8  然后输出结果 i=-8 然后在i+1 这里i=9
printf("%d\n",-i--);//-i--  接上面的值i=9   先进行负号运算  i=-9 然后输出结果 i=-9 然后在i-1  这里i=8
}

反编译的显示
6:    printf("%d\n",++i);  
0040102F   mov         eax,dword ptr [ebp-4]
00401032   add         eax,1                                   i 先进行增加
00401035   mov         dword ptr [ebp-4],eax        将结果赋值给i
00401038   mov         ecx,dword ptr [ebp-4]   
0040103B   push        ecx                                 
0040103C   push        offset string "%d\n" (0042001c)
00401041   call        printf (00401140)                              输出 i 的值  i=9
00401046   add         esp,8
7:    printf("%d\n",--i);
00401049   mov         edx,dword ptr [ebp-4]       接上面的值
0040104C   sub         edx,1                               先 i-1  
0040104F   mov         dword ptr [ebp-4],edx    值在存给i
00401052   mov         eax,dword ptr [ebp-4]
00401055   push        eax                                   
00401056   push        offset string "%d\n" (0042001c)
0040105B   call        printf (00401140)                                  输出i的值 i=8
00401060   add         esp,8
8:    printf("%d\n",i++);// 在接上面的值
00401063   mov         ecx,dword ptr [ebp-4]             接上面的值
00401066   mov         dword ptr [ebp-8],ecx
00401069   mov         edx,dword ptr [ebp-8]
0040106C   push        edx                                        保存i=8
0040106D   push        offset string "%d\n" (0042001c)      先输出 i的值 这里i=8
00401072   mov         eax,dword ptr [ebp-4]            
00401075   add         eax,1                                       这里算i+1
00401078   mov         dword ptr [ebp-4],eax              将值存进i
0040107B   call        printf (00401140)
00401080   add         esp,8                                      这里执行完后i=9
9:    printf("%d\n",i--); //接上面i的值
00401083   mov         ecx,dword ptr [ebp-4]                接上面的i=9
00401086   mov         dword ptr [ebp-0Ch],ecx
00401089   mov         edx,dword ptr [ebp-0Ch]
0040108C   push        edx
0040108D   push        offset string "%d\n" (0042001c)  这里先输出结果 i=9
00401092   mov         eax,dword ptr [ebp-4]
00401095   sub         eax,1                                              这里计算i-1
00401098   mov         dword ptr [ebp-4],eax
0040109B   call        printf (00401140)
004010A0   add         esp,8                                           执行完 i=8
10: printf("%d\n",-i++);
004010A3   mov         ecx,dword ptr [ebp-4]                 接上面i=8
004010A6   neg         ecx                                             这里先进行负号运算 这里i=-8
004010A8   mov         dword ptr [ebp-10h],ecx            
004010AB   mov         edx,dword ptr [ebp-10h]
004010AE   push        edx                                             这里将i=-8保存
004010AF   push        offset string "%d\n" (0042001c)  这里先输出 i=-8
004010B4   mov         eax,dword ptr [ebp-4]
004010B7   add         eax,1                                          这里对执行的是 i=8 然后 i+1  
004010BA   mov         dword ptr [ebp-4],eax                       这里i=9
004010BD   call        printf (00401140)
004010C2   add         esp,8
11:   printf("%d\n",-i--);
004010C5   mov         ecx,dword ptr [ebp-4]                       接上面的值 i=9
004010C8   neg         ecx                                                   这里进行负号运算 i=-9
004010CA   mov         dword ptr [ebp-14h],ecx
004010CD   mov         edx,dword ptr [ebp-14h]
004010D0   push        edx         
004010D1   push        offset string "%d\n" (0042001c)             这里先输出 i=-9
004010D6   mov         eax,dword ptr [ebp-4]                               这里对i=9 进行 i-1
004010D9   sub         eax,1
004010DC   mov         dword ptr [ebp-4],eax                                   最后的结果i=8
004010DF   call        printf (00401140)
004010E4   add         esp,8




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-29 19:39:58 | 显示全部楼层
printf("%d\n",++i);
等价于:
++i;
printf("%d\n",i);

printf("%d\n",i++);
等价于:
printf("%d\n",i);
++i;
所以LZ的程序等价于:
  1. #include <stdio.h>
  2. void main()
  3. {
  4.         int i = 8;
  5.         //printf("%d\n",++i);
  6.         ++i;
  7.         printf("%d\n",i);
  8.         //printf("%d\n",--i);
  9.         --i;
  10.         printf("%d\n",i);
  11.         //printf("%d\n",i++);
  12.         printf("%d\n",i);
  13.         ++i;
  14.         //printf("%d\n",i--);
  15.         printf("%d\n",i);
  16.         --i;
  17.         //printf("%d\n",-i++);
  18.         printf("%d\n",-i);
  19.         ++i;
  20.         //printf("%d\n",-i--);
  21.         printf("%d\n",-i);
  22.         --i;
  23. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-31 18:23:41 | 显示全部楼层
尼玛,我一看到问这个 我就想打人了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-31 20:25:42 | 显示全部楼层
像这种问题就是搞清楚,不然以后遇到更迷茫了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-31 20:34:39 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-31 20:48:57 | 显示全部楼层
湮汐 发表于 2012-3-31 20:34
怎么这么多人搞不懂自增自减呢!  我觉得没那么难啊!

你们C板块是不是要搞个 自增自减的专题了{:2_31:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-31 21:00:50 | 显示全部楼层
这有什么的,这个问题又没有编译器相关。之前很多问题答案是编译器相关的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-31 21:03:03 | 显示全部楼层
呵呵 ,说的也是 !跟编译器有关的难解释。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 10:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表