首页
社区
课程
招聘
[旧帖] [求助]请问一个C的超菜问题? 0.00雪花
发表于: 2007-11-26 17:59 6313

[旧帖] [求助]请问一个C的超菜问题? 0.00雪花

2007-11-26 17:59
6313

main()
{
  int i=8;
  printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);
}
这个输出的顺序从右到左我知道,
但输出的结果有点不太明白,在我的理解中-i-- 应该是-8再减去1输出的结果应该是-9,但答案是7

大虾们不要笑话俺,请教下。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
为什么是从右到左输出?
2007-11-26 20:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
如果从右到左输的话,最先输出的,也就是-i--,在我电脑上是-8
我是这样理解的:
i--,表示先使用i,再将i值减1。所以你可以先不看--,应该输出-8,然后i值-1,就对了。不过你电脑上为什么是7我就不明白了。
偶也菜鸟一个,呵呵!
2007-11-26 21:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不同的编译器的输出方向可能不一样,就TURBO C是从右往左输出,
我在VS2005上运行的结果是8 7 8 8 -8 -8
彻底晕菜
2007-11-27 08:33
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
通常来说,这样的格式要避免出现在程序中,
他的输出结果是不确定的
2007-11-27 08:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢楼上提醒,我是想确定一下我的结果和答案为什么不一样。
楼上is a girl ?
2007-11-27 09:29
0
雪    币: 350
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
单目运算符有结合律吧,自右向左的结合,-i--,先满足从右往左, -(I--) .
俺也乱蒙的.
2007-11-27 12:05
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
老兄错了把,i-- 是先参与运算后再自减1,--i 是先自减1后再参与运算
2007-11-27 13:19
0
雪    币: 350
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
怎么也算不出是7.  你反汇编一下看看,可能就清楚了.
2007-11-27 13:33
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
VC++6.0 Debug版:
00401005  /$ /E9 06000000   jmp     00401010
0040100A  |  |CC            int3
0040100B  |  |CC            int3
0040100C  |  |CC            int3
0040100D  |  |CC            int3
0040100E  |  |CC            int3
0040100F  |  |CC            int3
00401010  |> \55            push    ebp
00401011  |.  8BEC          mov     ebp, esp
00401013  |.  83EC 54       sub     esp, 54
00401016  |.  53            push    ebx
00401017  |.  56            push    esi
00401018  |.  57            push    edi
00401019  |.  8D7D AC       lea     edi, dword ptr [ebp-54]
0040101C  |.  B9 15000000   mov     ecx, 15
00401021  |.  B8 CCCCCCCC   mov     eax, CCCCCCCC
00401026  |.  F3:AB         rep     stos dword ptr es:[edi]
00401028  |.  C745 FC 08000>mov     dword ptr [ebp-4], 8
0040102F  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
00401032  |.  F7D8          neg     eax
00401034  |.  8945 F8       mov     dword ptr [ebp-8], eax
00401037  |.  8B4D F8       mov     ecx, dword ptr [ebp-8]
0040103A  |.  51            push    ecx                              ; /Arg7 = FFFFFFF8
0040103B  |.  8B55 FC       mov     edx, dword ptr [ebp-4]           ; |
0040103E  |.  F7DA          neg     edx                              ; |
00401040  |.  8955 F4       mov     dword ptr [ebp-C], edx           ; |
00401043  |.  8B45 F4       mov     eax, dword ptr [ebp-C]           ; |
00401046  |.  50            push    eax                              ; |Arg6
00401047  |.  8B4D FC       mov     ecx, dword ptr [ebp-4]           ; |
0040104A  |.  894D F0       mov     dword ptr [ebp-10], ecx          ; |
0040104D  |.  8B55 F0       mov     edx, dword ptr [ebp-10]          ; |
00401050  |.  52            push    edx                              ; |Arg5
00401051  |.  8B45 FC       mov     eax, dword ptr [ebp-4]           ; |
00401054  |.  8945 EC       mov     dword ptr [ebp-14], eax          ; |
00401057  |.  8B4D EC       mov     ecx, dword ptr [ebp-14]          ; |
0040105A  |.  51            push    ecx                              ; |Arg4
0040105B  |.  8B55 FC       mov     edx, dword ptr [ebp-4]           ; |
0040105E  |.  83EA 01       sub     edx, 1                           ; |
00401061  |.  8955 FC       mov     dword ptr [ebp-4], edx           ; |
00401064  |.  8B45 FC       mov     eax, dword ptr [ebp-4]           ; |
00401067  |.  50            push    eax                              ; |Arg3
00401068  |.  8B4D FC       mov     ecx, dword ptr [ebp-4]           ; |
0040106B  |.  83C1 01       add     ecx, 1                           ; |
0040106E  |.  894D FC       mov     dword ptr [ebp-4], ecx           ; |
00401071  |.  8B55 FC       mov     edx, dword ptr [ebp-4]           ; |
00401074  |.  52            push    edx                              ; |Arg2
00401075  |.  68 1C004200   push    0042001C                         ; |%d\n%d\n%d\n%d\n%d\n%d\n
0040107A  |.  8B45 FC       mov     eax, dword ptr [ebp-4]           ; |
0040107D  |.  83C0 01       add     eax, 1                           ; |
00401080  |.  8945 FC       mov     dword ptr [ebp-4], eax           ; |
00401083  |.  8B4D FC       mov     ecx, dword ptr [ebp-4]           ; |
00401086  |.  83E9 01       sub     ecx, 1                           ; |
00401089  |.  894D FC       mov     dword ptr [ebp-4], ecx           ; |
0040108C  |.  8B55 FC       mov     edx, dword ptr [ebp-4]           ; |
0040108F  |.  83C2 01       add     edx, 1                           ; |
00401092  |.  8955 FC       mov     dword ptr [ebp-4], edx           ; |
00401095  |.  8B45 FC       mov     eax, dword ptr [ebp-4]           ; |
00401098  |.  83E8 01       sub     eax, 1                           ; |
0040109B  |.  8945 FC       mov     dword ptr [ebp-4], eax           ; |
0040109E  |.  E8 4D000000   call    004010F0                         ; \dsfaa.004010F0
004010A3  |.  83C4 1C       add     esp, 1C
004010A6  |.  33C0          xor     eax, eax
004010A8  |.  5F            pop     edi
004010A9  |.  5E            pop     esi
004010AA  |.  5B            pop     ebx
004010AB  |.  83C4 54       add     esp, 54
004010AE  |.  3BEC          cmp     ebp, esp
004010B0  |.  E8 BB000000   call    00401170
004010B5  |.  8BE5          mov     esp, ebp
004010B7  |.  5D            pop     ebp
004010B8  \.  C3            retn
2007-11-27 19:39
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
在VC6.0中,是8 7 8 8 -8 -8
过程是:
push -i //把i取反,再压入堆栈,留着后面再自减,最后一个是-8
push -i //把i取反,再压入堆栈,留着后面再自加,倒数第二个是-8
push i//把i压入堆栈,留着后面再自减,倒数第三个是8
push i//把i压入堆栈,留着后面再自加,倒数第四个是8
i=i-1,push i//i减1,再把i压入堆栈,第二个是7
i=i+1,push i//i加1,再把i压入堆栈,第一个是8
push addr "%d\n%d\n%d\n%d\n%d\n%d\n"
到此,printf()的结果已经确定。
下面进行未完成的自加或自减:
add i,1//i++
sub i,1//i--
add i,1 //-i++
sub i,1 //-i--
所以最后的i的值还是8

在其它编译器,没有验证,大家有兴趣可以自己试。
2007-11-27 20:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
vc6.0和 vs2005结果是一样的,
我看的那个例题的答案是这样的解释的:
先对最后一项“-i--”求值,结果为-8,然后i自减1后为7。 再对“-i++”项求值得-7,然后i自增1后为8。再对“i--”项求值得8,然后i再自减1后为7。再求“i++”项得7,然后i再自增1后为8。 再求“--i”项,i先自减1后输出,输出值为7。 最后才求输出表列中的第一项“++i”,此时i自增1后输出8。
2007-11-28 10:44
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
哪个编译器?
2007-11-28 10:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
答案用的是Turbo C
2007-11-28 11:06
0
雪    币: 148
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这是个笔试题吗?真够啰唆的呀,
2007-11-28 11:54
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
各个编译器编译原理肯定不一样了.结果也就有差异了.
2007-11-28 12:54
0
游客
登录 | 注册 方可回帖
返回
//