能力值:
( LV2,RANK:10 )
|
-
-
2 楼
为什么是从右到左输出?
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
如果从右到左输的话,最先输出的,也就是-i--,在我电脑上是-8
我是这样理解的:
i--,表示先使用i,再将i值减1。所以你可以先不看--,应该输出-8,然后i值-1,就对了。不过你电脑上为什么是7我就不明白了。
偶也菜鸟一个,呵呵!
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
不同的编译器的输出方向可能不一样,就TURBO C是从右往左输出,
我在VS2005上运行的结果是8 7 8 8 -8 -8
彻底晕菜
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
通常来说,这样的格式要避免出现在程序中,
他的输出结果是不确定的
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
谢谢楼上提醒,我是想确定一下我的结果和答案为什么不一样。
楼上is a girl ?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
单目运算符有结合律吧,自右向左的结合,-i--,先满足从右往左, -(I--) .
俺也乱蒙的.
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
老兄错了把,i-- 是先参与运算后再自减1,--i 是先自减1后再参与运算
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
怎么也算不出是7. 你反汇编一下看看,可能就清楚了.
|
能力值:
( 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
|
能力值:
( 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
在其它编译器,没有验证,大家有兴趣可以自己试。
|
能力值:
( 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。
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
哪个编译器?
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
答案用的是Turbo C
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
这是个笔试题吗?真够啰唆的呀,
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
各个编译器编译原理肯定不一样了.结果也就有差异了.
|