wangxiaoit 发表于 2012-2-26 23:20:03

关于printf和++ --的问题

int i=8;
        printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n",i,++i,--i,++i,i--,-i++,-i--);
结果为什么是9,9,8,9,8,-8,-8

莫名其妙 发表于 2012-2-28 10:34:00

本帖最后由 莫名其妙 于 2012-2-28 10:38 编辑

这个 我看起来费劲 发上来你自己看看吧
#include <stdio.h>
void main()
{
int i=8;
      printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n",i,++i,--i,++i,i--,-i++,-i--);
}

下面是关键部分汇编代码(全部的我就不发了太长了!~)

CONST SEGMENT
??_C@_0BG@KAOE@?$CFd?6?$CFd?6?$CFd?6?$CFd?6?$CFd?6?$CFd?6?$CFd?6?$AA@ DB '%'
DB 'd', 0aH, '%d', 0aH, '%d', 0aH, '%d', 0aH, '%d', 0aH, '%d', 0aH
DB '%d', 0aH, 00H    ; `string'
CONST ENDS
; COMDAT _main
_TEXT SEGMENT
_i$ = -4
_main PROC NEAR   ; COMDAT
; File D:\Media\1246\1.c
; Line 3
push ebp
mov ebp, esp
sub esp, 80   ; 00000050H
push ebx
push esi
push edi
lea edi, DWORD PTR
mov ecx, 20   ; 00000014H
mov eax, -858993460    ; ccccccccH
rep stosd
; Line 4
mov DWORD PTR _i$, 8
; Line 5
mov eax, DWORD PTR _i$
neg eax ;NEG是汇编指令中的求补指令,NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数。求补运算也可以表达成:将操作数按位取反后加1; ;
;;  格式:NEG OPR   执行的操作:(OPR)<-- —(OPR)   亦即把操作数按位求反后末位加1,因而执行的操作也可表示为:   (OPR)<-- 0FFFFH — (OPR) + 1 ;
;;  NEG指令对标志的影响与用零作减法的SUB指令一样。 ;
mov DWORD PTR -8+, eax
mov ecx, DWORD PTR -8+
push ecx
mov edx, DWORD PTR _i$
neg edx
mov DWORD PTR -12+, edx
mov eax, DWORD PTR -12+
push eax
mov ecx, DWORD PTR _i$
mov DWORD PTR -16+, ecx
mov edx, DWORD PTR -16+
push edx
mov eax, DWORD PTR _i$
add eax, 1
mov DWORD PTR _i$, eax
mov ecx, DWORD PTR _i$
push ecx
mov edx, DWORD PTR _i$
sub edx, 1
mov DWORD PTR _i$, edx
mov eax, DWORD PTR _i$
push eax
mov ecx, DWORD PTR _i$
add ecx, 1
mov DWORD PTR _i$, ecx
mov edx, DWORD PTR _i$
push edx
mov eax, DWORD PTR _i$
push eax
push OFFSET FLAT:??_C@_0BG@KAOE@?$CFd?6?$CFd?6?$CFd?6?$CFd?6?$CFd?6?$CFd?6?$CFd?6?$AA@ ; `string'
mov ecx, DWORD PTR _i$
sub ecx, 1
mov DWORD PTR _i$, ecx
mov edx, DWORD PTR _i$
add edx, 1
mov DWORD PTR _i$, edx
mov eax, DWORD PTR _i$
sub eax, 1
mov DWORD PTR _i$, eax
call _printf
add esp, 32   ; 00000020H
; Line 6
pop edi
pop esi
pop ebx
add esp, 80   ; 00000050H
cmp ebp, esp
call __chkesp
mov esp, ebp
pop ebp
ret 0
_main ENDP
_TEXT ENDS
END

wangxiaoit 发表于 2012-3-2 19:14:13

莫名其妙 发表于 2012-2-28 10:34 static/image/common/back.gif
这个 我看起来费劲 发上来你自己看看吧
#include
void main()


汇编有的我还看不懂,我知道是怎么计算的了。谢谢!

1023545590 发表于 2012-3-3 01:13:18

看看是怎么解决这个问题的,学习中~
页: [1]
查看完整版本: 关于printf和++ --的问题