飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7608|回复: 11

[C/C++] 关于C中遇到的问题

[复制链接]

该用户从未签到

发表于 2009-5-8 00:40:16 | 显示全部楼层 |阅读模式
.

大家这两天先看下书 周末给大家视频

遇到问题 或想不明白的时候呢 或者在群里请教下其他朋友

如果正好是我们视频中讲到的东西 或者是将要将到的内容有你不明白的 可以在这个版块发帖提问 到时候我会在视频上给大家解答
PYG19周年生日快乐!

该用户从未签到

发表于 2009-5-8 01:24:07 | 显示全部楼层
版主这么晚了还没休息呀。
看了第一集感觉讲的很精彩,庆幸自己能参加进来
两门课程以前都学过,但是都是懂得皮毛,从来没用来编过小程序
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-4-29 07:52
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2009-5-8 15:41:10 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2017-10-25 13:07
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2009-5-8 16:59:32 | 显示全部楼层

    今天在群里关于这样个 问题 i++与++i的区别

    这个文章可以看看
    如果有表达式 a = i++  它等价于 a = i ; i = i + 1;
           如果有表达式 a = ++i  它等价于   i = i + 1; a = i;

           1 首先两者的区别是:前者是先赋值,然后再自增;后者是先自增,后赋值

           2 ++i和i++都是分两步完成的。因为++i 是后面一步才赋值的,所以它能够当作一个变量进行级联赋值,++i = a =b,即 ++i 是一个左值(可被寻址的值);i++ 的后面一步是自增,不是左值。(2的两步分解与左右值的因果关系只是我的直觉,对错还待考证)

           3  ++i 和i++ 的使用,一般来说在循环域里面,这两者并没有什么很大的区别,因为编译器一般都会给你做优化。但是要注意其生存周期,以及很难察觉的写脏,就好像指针delete以后一定要赋予0一样,我们要注意i值在程序流中的变化。

           4  i=1 ; j=(++i)+(++i)+(++i); printf("J=%d\n",j); 这个结果是什么?没有结果,因为不同的编译器做出来的结果,我用vc6和gcc出来的结果是一样的,但是我坚信这么多不同编译器的优化规则都会导致这个怪异的结果。回过头来,这样coding,你会疯掉的,左手logic,右手biology千万别走火入魔!

           5 我们来看看在++行为上表现迥异的c++程序和java程序

    test.java

    public class test{

              public static void main(String args[]){

                    int i = 0 , j ;

                    for(j=0;j<5;j++){

                          i=i++; System.out.println("i="+i);

                    }

             }

    }

    test.c

    #include<stdio.h>

    main(){

      int i = 0 , j ;

      for(j=0;j<5;j++){

         i=i++ ; printf("i=%d\n",i);

      }

    }

    test.java的结果是 i=0 i=0 i=0 i=0 i=0, test.c的结果是 i=1 i =2 i=3 i=4 i =5

    为什么这样呢?其实不必太在乎啦,都是编译器惹的祸,java的编译器对于i = i++,相当于temp = i ; i = i+1 ; i = temp 所以现在我们明白了!而在C的编译机制里面i = i++ ,它只是做了i++这么一件事情!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-8 21:17:52 | 显示全部楼层
    正在看C呢,希望能跟上步伐
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-8 22:45:53 | 显示全部楼层
    等我加入群先、、 来个群管理员通过就好了  等待中
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-8 23:08:14 | 显示全部楼层
    没编程基础、希望能跟上节奏!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-8 23:34:38 | 显示全部楼层
    原帖由 MOV 于 2009-5-8 16:59 发表
    这个文章可以看看
    如果有表达式 a = i++  它等价于 a = i ; i = i + 1;
           如果有表达式 a = ++i  它等价于   i = i + 1; a = i;

           1 首先两者的区别是:前者是先赋值,然后再自增;后者是先自增,后 ...

    我也看了一下:
    1. #include "stdio.h"
    2. main()
    3. {
    4.    int i=8;
    5.    printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);   
    6. }
    复制代码
    运行结果:
    8
    7
    7
    8
    -7
    -8
    扔进IDA:

    1. seg000:01FA ; int __cdecl main(int argc, const char **argv, const char *envp)
    2. seg000:01FA _main           proc near               ; CODE XREF: start+11Ap
    3. seg000:01FA
    4. seg000:01FA argc            = word ptr  2
    5. seg000:01FA argv            = dword ptr  4
    6. seg000:01FA envp            = dword ptr  8
    7. seg000:01FA
    8. seg000:01FA                 push    si
    9. seg000:01FB                 mov     si, 8           ; si=8
    10. seg000:01FE                 mov     ax, si          ; ax=8
    11. seg000:0200                 dec     si              ; 7
    12. seg000:0201                 neg     ax              ; -8
    13. seg000:0203                 push    ax              ; -8第六个[-i--]
    14. seg000:0204                 mov     ax, si          ; i++
    15. seg000:0206                 inc     si              ; -i++
    16. seg000:0207                 neg     ax              ; -7
    17. seg000:0209                 push    ax              ; -7第五个
    18. seg000:020A                 mov     ax, si          ; 8
    19. seg000:020C                 dec     si              ; i--
    20. seg000:020D                 push    ax              ; 8第四个
    21. seg000:020E                 mov     ax, si          ; 7
    22. seg000:0210                 inc     si              ; i++
    23. seg000:0211                 push    ax              ; 7第三个
    24. seg000:0212                 dec     si              ; --i
    25. seg000:0213                 mov     ax, si
    26. seg000:0215                 push    ax              ; 7 第二个
    27. seg000:0216                 inc     si              ; ++i
    28. seg000:0217                 mov     ax, si
    29. seg000:0219                 push    ax              ; 8第一个
    30. seg000:021A                 mov     ax, 194h
    31. seg000:021D                 push    ax              ; format
    32. seg000:021E                 call    _printf
    33. seg000:0221                 add     sp, 0Eh
    34. seg000:0224                 pop     si
    35. seg000:0225                 retn
    36. seg000:0225 _main           endp
    复制代码
    这样一来就很明了了,哪个是先加,哪个是后加一目了然。
    由于C的调用约定是右向左,所以右边的先入堆栈。而printf函数是先输出左边的再到右边的。因此输出结果是8 7 7 8 -7 -8
    看来了解汇编之后再学C就理解得比较深刻一些。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-9 11:33:08 | 显示全部楼层
    原帖由 飘之叶 于 2009-5-8 23:34 发表

    我也看了一下:#include "stdio.h"
    main()
    {
       int i=8;
       printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);   
    }
    运行结果:
    8
    7
    7
    8
    -7
    -8
    扔进IDA:
    seg000:01FA ; int __cde ...


    在复习C,不过不懂你现在所讲的。。。或许以后就懂了。。。呵呵!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-9 18:47:33 | 显示全部楼层
    谢谢
    Nisy大哥正在看书呢。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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