免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: koolcoy
打印 上一主题 下一主题

求助: 在if中定义的变量 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2007-05-21 16:08 |只看该作者
to beepbug,

if (xxx) {
   int i;

}

i 无论XXX是真是假,无论进入不进入if{},都已经是分配的了. 是在进入if所在的FUNCTION开始分配的. 和进入if无关.

LZ问的动态的意思是是否随着if(xxx)的进入而按需要分的(如果不进入就不分), 从这意义上不是动态的. 当然相对与if所在函数是动态的.但LZ问的不是哪个意思.

编译WHY这么做?为了效率,同时不违反什么

什么叫"不能看程序"?
许多问题倒是"不能看书"得到答案.

论坛徽章:
0
32 [报告]
发表于 2007-05-21 16:37 |只看该作者
这个i 的生存期都在这对{}内;无论进入分支,i都生成了的(在函数的栈内有 i );
     用脑袋想想,难道在函数运行的时候,再在栈里面分配一个内存空间给i么? 这个编译的时候都已经确定了要给i一个空间;

     思克斑竹说的对。。。。

论坛徽章:
0
33 [报告]
发表于 2007-05-21 16:42 |只看该作者
不访问应该不存在

论坛徽章:
0
34 [报告]
发表于 2007-05-21 20:49 |只看该作者
原帖由 思一克 于 2007-5-21 16:08 发表
i 无论XXX是真是假,无论进入不进入if{},都已经是分配的了. 是在进入if所在的FUNCTION开始分配的. 和进入if无关.

LZ问的动态的意思是是否随着if(xxx)的进入而按需要分的(如果不进入就不分), 从这意义上不是动态的. 当然相对与if所在函数是动态的.但LZ问的不是哪个意思.
这段看不懂。你自己看得懂嘛?

编译WHY这么做?为了效率,同时不违反什么

什么叫"不能看程序"?
许多问题倒是"不能看书"得到答案.


我没叫你别看程序。只是说,先要弄清问题。
我劝你还是要看书。看看进程与存储分配方面的书。

论坛徽章:
0
35 [报告]
发表于 2007-05-21 20:55 |只看该作者
局部变量生成在栈里。当进入它所在的代码块时,生成(实质上是做压栈操作),离开该代码块时,消失(弹出操作。实际上该变量还在,只是逻辑上我们认为它不存在了,不可访问了。)。再次进入该代码块时,再次生成。为什么把栈分配归入动态分配,就是这个原因。

论坛徽章:
0
36 [报告]
发表于 2007-05-21 20:58 |只看该作者
原帖由 beepbug 于 2007-5-21 20:49 发表


我没叫你别看程序。只是说,先要弄清问题。
我劝你还是要看书。看看进程与存储分配方面的书。


汗~~
这位仁兄貌似很牛,不知是否果真这么牛。但相信和克版还是有一段差距的。

另:请拿点实际出来支持你的论点。贴出编译出来的代码或者自已试着实现 if(){} 为 true 时和 false 时生成变量的代码

论坛徽章:
0
37 [报告]
发表于 2007-05-21 20:59 |只看该作者
to 楼上,

我看了LZ的问题几秒后就弄清问题了,也说出正确答案了.
是你没有弄清, 才说了那么多海阔天空来.

原帖由 beepbug 于 2007-5-21 20:49 发表


我没叫你别看程序。只是说,先要弄清问题。
我劝你还是要看书。看看进程与存储分配方面的书。

论坛徽章:
0
38 [报告]
发表于 2007-05-21 21:10 |只看该作者
TO beepbug,

你根本没有弄明白,根据书本的理论在加符合逻辑的想象就得出了不正确的结论.
许多编译根本没有根据"代码块"动态地" "压栈" "弹出". GCC+就没有.

还有,这东西你争论什么? 这不是不存在事实的理论性的东西还可以争论和有争论的余地.
这个是一个十分简单的事实. 不具有争论的前提. 在G++上看一下C产生的汇编代码就有结论了.

可能有例外. 比如在什么其他编译上.



原帖由 beepbug 于 2007-5-21 20:55 发表
局部变量生成在栈里。当进入它所在的代码块时,生成(实质上是做压栈操作),离开该代码块时,消失(弹出操作。实际上该变量还在,只是逻辑上我们认为它不存在了,不可访问了。)。再次进入该代码块时,再次生成。 ...

论坛徽章:
0
39 [报告]
发表于 2007-05-21 21:36 |只看该作者
c99 支持的动态数组,这是唯一能够被利用去支持 beepbug 论点的唯一一种实现方式吧。

不过,利用条件的真假来计算生成变量空间,比计算数组大小难度大得非常多。恐怕没一个编译器做得到。至少目前没有吧。
即使能这样做到。但也不能算是所谓的动态生成,还是有形的

论坛徽章:
0
40 [报告]
发表于 2007-05-21 21:49 |只看该作者
自己看吧.



  1. #include <stdio.h>
  2. main(int argc, char **argv)
  3. {
  4. int i;
  5.   i = 123;
  6.   if(argc) {
  7.         int a[128];
  8.         a[1] = 456;
  9.   }
  10. }



  11.         .file   "tt.c"
  12.         .text
  13. .globl main
  14.         .type   main,@function
  15. main:
  16.         pushl   %ebp
  17.         movl    %esp, %ebp
  18.         subl    $536, %esp
  19.         andl    $-16, %esp
  20.         movl    $0, %eax
  21.         subl    %eax, %esp
  22.         movl    $123, -12(%ebp)
  23.         cmpl    $0, 8(%ebp)
  24.         je      .L2

  25.         //这里就是if块内. 512个字节空间早在外面就留好了的. 块内无动态申请归还
  26.         movl    $456, -532(%ebp)

  27. .L2:
  28.         leave
  29.         ret
  30. .Lfe1:
  31.         .size   main,.Lfe1-main
  32.         .ident  "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP