肖凯文kevin 发表于 2012-3-3 23:53:40

关于i++和i-- 的问题

本帖最后由 肖凯文kevin 于 2012-3-3 23:58 编辑

#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--);
}
希望前辈能给我解释清楚这个i++和i--的问题,其实++i和--i也不是很理解,麻烦前辈赐教了。
为什么这几个ptintf的顺序排列不同导致的结果就差别那么大呢

岁〆月有√声 发表于 2012-3-3 23:53:41

肖凯文kevin 发表于 2012-3-4 11:44 static/image/common/back.gif
看样子我要跳过这个问题了,还是无法理解为什么会是这样的结果,特别是不明白第四个为什么是9,现在似乎连 ...

void main()
{
      int i=8;
      printf("%d\n",++i);//先i++,即i=8+1;再printf(i)=9
      printf("%d\n",--i);//这里先自减,即i=9-1;再printf(i)=8
      printf("%d\n",i++);//这里呢,先printf(i),所以输出8,然后再自增嘛,i=9了。
      printf("%d\n",i--);//这里同上,就是先printf(i)了...后自减,以下都差不多~
      printf("%d\n",-i++);
      printf("%d\n",-i--);
}
这样明白不?

小唐 发表于 2012-3-4 00:14:53

呵呵。教你简单的一个理解。看数在哪边。数在前边就先自增减,再去运算
数在后面就先运算,再自增减;P

1023545590 发表于 2012-3-4 01:09:34

围观看看,:loveliness:

嗜血灵异狂 发表于 2012-3-4 06:05:25

从调试的结果来看_main        proc        far
        push        si
;        ?debug        L 5
        mov        si,8
;        ?debug        L 6
        inc        si
        mov        ax,si
        push        ax
        mov        ax,offset DGROUP:s@
        push        ax
        call        far ptr _printf
        pop        cx
        pop        cx
;        ?debug        L 7
        dec        si
        mov        ax,si
        push        ax
        mov        ax,offset DGROUP:s@
        push        ax
        call        far ptr _printf
        pop        cx
        pop        cx
;        ?debug        L 8
        mov        ax,si
        inc        si
        push        ax
        mov        ax,offset DGROUP:s@
        push        ax
        call        far ptr _printf
        pop        cx
        pop        cx
;        ?debug        L 9
        mov        ax,si
        dec        si
        push        ax
        mov        ax,offset DGROUP:s@
        push        ax
        call        far ptr _printf
        pop        cx
        pop        cx
;        ?debug        L 10
        mov        ax,si
        inc        si
        neg        ax
        push        ax
        mov        ax,offset DGROUP:s@
        push        ax
        call        far ptr _printf
        pop        cx
        pop        cx
;        ?debug        L 11
        mov        ax,si
        dec        si
        neg        ax
        push        ax
        mov        ax,offset DGROUP:s@
        push        ax
        call        far ptr _printf
        pop        cx
        pop        cx
;        ?debug        L 12
        call        far ptr _getch
@1:
;        ?debug        L 13
        pop        si
        ret       
_main        endp
1_TEXT        ends
        ?debug        C E9
_DATA        segment word public 'DATA'
s@        label        byte
        db        37
        db        100
        db        10
        db        0
_DATA        ends
        extrn        _printf:far
        extrn        _getch:far
1_TEXT        segment        byte public 'CODE'
1_TEXT        ends
        public        _main
        end这是汇编源代码

嗜血灵异狂 发表于 2012-3-4 06:19:59

本帖最后由 嗜血灵异狂 于 2012-3-4 06:48 编辑

我没有VC6.0++不能进行那种反编译
我只能告诉你inc是自增dec是自减   neg是原码取反低字节 (换成二进制)就是负数       我也想起来了小甲鱼也曾经再一个视频中讲过 这中++--运算符号再没中编译器调试结果都不一样的   你只要知道关系运算符号的优先次序就行了

yujun6064471 发表于 2012-3-4 09:34:19

等等吧!!!!!!!!!!!

岁〆月有√声 发表于 2012-3-4 11:16:41

第一个输出9,++i,先把i自增,再取值;--i同理。i++先取i值,再自增,以下同理!不懂可以再问~_~

肖凯文kevin 发表于 2012-3-4 11:44:11

岁〆月有√声 发表于 2012-3-4 11:16 static/image/common/back.gif
第一个输出9,++i,先把i自增,再取值;--i同理。i++先取i值,再自增,以下同理!不懂可以再问~_~

看样子我要跳过这个问题了,还是无法理解为什么会是这样的结果,特别是不明白第四个为什么是9,现在似乎连第一个为什么是9我也不知道了,还是继续去看小甲鱼的视频了。

肖凯文kevin 发表于 2012-3-4 12:29:54

岁〆月有√声 发表于 2012-3-3 23:53 static/image/common/back.gif
void main()
{
      int i=8;


终于明白了,每次都调用上次的i值,只记得先printf,却忘记了printf后还要加或者减得,真是粗心啊,感谢前辈的耐心讲解啊。为什么每次的printf都要用上次的i值呢?

1020232499 发表于 2012-3-4 16:25:20

肖凯文kevin 发表于 2012-3-4 12:29 static/image/common/back.gif
终于明白了,每次都调用上次的i值,只记得先printf,却忘记了printf后还要加或者减得,真是粗心啊,感谢前 ...

假设
i=2
++i是先把i+1赋值给i然后再输出3
下一次再调用i时i=3
i++是先输出2再把i+1赋值给i
下一次再调用i时i=3

key2046 发表于 2017-1-11 17:27:39

看样子我要跳过这个问题了,还是无法理解为什么会是这样的结果,特别是不明白第四个为什么是9,现在似乎连第一个为什么是9我也不知道了,还是继续去看小甲鱼的视频了。
页: [1]
查看完整版本: 关于i++和i-- 的问题