Nisy 发表于 2009-5-8 00:40:16

关于C中遇到的问题

.

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

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

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

kelvar 发表于 2009-5-8 01:24:07

版主这么晚了还没休息呀。
看了第一集感觉讲的很精彩,庆幸自己能参加进来
两门课程以前都学过,但是都是懂得皮毛,从来没用来编过小程序

HDd1145 发表于 2009-5-8 15:41:10

MOV 发表于 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值在程序流中的变化。

       4i=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++这么一件事情!

千江月 发表于 2009-5-8 21:17:52

正在看C呢,希望能跟上步伐

crackiss 发表于 2009-5-8 22:45:53

等我加入群先、、 来个群管理员通过就好了等待中

chinaren 发表于 2009-5-8 23:08:14

没编程基础、希望能跟上节奏!

飘之叶 发表于 2009-5-8 23:34:38

原帖由 MOV 于 2009-5-8 16:59 发表 https://www.chinapyg.com/images/common/back.gif
这个文章可以看看
如果有表达式 a = i++它等价于 a = i ; i = i + 1;
       如果有表达式 a = ++i它等价于   i = i + 1; a = i;

       1 首先两者的区别是:前者是先赋值,然后再自增;后者是先自增,后 ...
我也看了一下:#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 __cdecl main(int argc, const char **argv, const char *envp)
seg000:01FA _main         proc near               ; CODE XREF: start+11Ap
seg000:01FA
seg000:01FA argc            = word ptr2
seg000:01FA argv            = dword ptr4
seg000:01FA envp            = dword ptr8
seg000:01FA
seg000:01FA               push    si
seg000:01FB               mov   si, 8         ; si=8
seg000:01FE               mov   ax, si          ; ax=8
seg000:0200               dec   si            ; 7
seg000:0201               neg   ax            ; -8
seg000:0203               push    ax            ; -8第六个[-i--]
seg000:0204               mov   ax, si          ; i++
seg000:0206               inc   si            ; -i++
seg000:0207               neg   ax            ; -7
seg000:0209               push    ax            ; -7第五个
seg000:020A               mov   ax, si          ; 8
seg000:020C               dec   si            ; i--
seg000:020D               push    ax            ; 8第四个
seg000:020E               mov   ax, si          ; 7
seg000:0210               inc   si            ; i++
seg000:0211               push    ax            ; 7第三个
seg000:0212               dec   si            ; --i
seg000:0213               mov   ax, si
seg000:0215               push    ax            ; 7 第二个
seg000:0216               inc   si            ; ++i
seg000:0217               mov   ax, si
seg000:0219               push    ax            ; 8第一个
seg000:021A               mov   ax, 194h
seg000:021D               push    ax            ; format
seg000:021E               call    _printf
seg000:0221               add   sp, 0Eh
seg000:0224               pop   si
seg000:0225               retn
seg000:0225 _main         endp
这样一来就很明了了,哪个是先加,哪个是后加一目了然。
由于C的调用约定是右向左,所以右边的先入堆栈。而printf函数是先输出左边的再到右边的。因此输出结果是8 7 7 8 -7 -8
看来了解汇编之后再学C就理解得比较深刻一些。

skiy 发表于 2009-5-9 11:33:08

原帖由 飘之叶 于 2009-5-8 23:34 发表 https://www.chinapyg.com/images/common/back.gif

我也看了一下:#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,不过不懂你现在所讲的。。。或许以后就懂了。。。呵呵!

最忌注册 发表于 2009-5-9 18:47:33

谢谢
Nisy大哥正在看书呢。
页: [1] 2
查看完整版本: 关于C中遇到的问题