如何理解:编译时赋初值

xiao_potato 2003-09-06 06:00:48
昨天嫌没事把谭浩强那本书翻了翻,以下几句当年为了考试都不知看了多少遍。
现在却看不懂了,劳驾各位麻烦讲讲怎么回事

“对局部静态变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值”
“只有在存储在静态存储区中的数组才能初始化,这个初始化的处理是在编译过程中完成的”
“全局变量是在函数的外部定义的,编译时分配在静态存储区”

1。众所周知,静态存储区是内存中供用户使用的存储空间。编译时是怎么赋初值?,变量如何分配在静态存储区?我纳闷的是,我光编译,不运行,莫非也在内存中占据空间。可我的理解是,一个可执行文件,不运行,说什么也不会到内存中占空间的
2。如果编译时分配在静态存储区看成是一种事先约定,即程序一运行,变量才开始真正的分配在静态存储区。那么那个值事先存放在什么地方呢?
3。说说动态变量吧,比如int a = 5。这个5在程序没有运行时放在什么地方呢?,是不是和问题2中同一个地方。那么唯一的区别就是动态数据和静态数据存储的地方不同,那为什么要说是编译时赋的初值
4。那么编译时赋不赋初值又有何区别呢,晕了,我都不知道该怎么问了

不好意思,没学过编译原理和汇编语言。问的问题可能有点低级
...全文
200 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
CAT323 2003-09-08
  • 打赏
  • 举报
回复
编译其实只是一个扫描过程,进行词法语法检查,代码优化而已,编译程序越好,程序运行的时候越高效(包括对寄存器组、运算器的高效使用。当然,首先也要保证有高效的程序),编译时付初值,只是形成一个文本,检查无错误,并没有分配内存空间。

1:“对局部静态变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值”
这里我以一个程序为例:
f(a)
int a;
{int b=0;
static int c=3;
b=b+1;
c=c+1;
return(a+b+c);
}
main()
{int a=2,i;
for(i=0;i<3;i++)
printf("%d",f(a));
}
这个程序中循环调用f(a)时,b变量是每次都被赋值为0的,而c作为局部静态变量则只赋值一次,以后的循环中,intc=3语句其实并不起作用。

编译时,我理解的是当遇到静态变量时,只是起到说明作用,告诉系统有这么一个变量,它在运行时分配存储空间后,固定不变,函数运行完之前不释放。但这个时候仍没有给静态变量分配空间。直到程序运行到这个函数时才分配了存储空间。

数组赋值的方式常用的主要是两种:一种是初始化(花括号预先输入值:int a[]={.,.,.,.});一种是运行时读入for(i=0;i<=n;i++) scanf("%d",&a[i])



techlibin 2003-09-07
  • 打赏
  • 举报
回复
参见
http://soft.winzheng.com/infoview/Article_269.htm
xiao_potato 2003-09-06
  • 打赏
  • 举报
回复
楼上的,什么是PE结构?
zfbt 2003-09-06
  • 打赏
  • 举报
回复
1,是的,一个EXE文件,不运行 ,是不会在内存中占用空间的.它的意思是说当编译的时候这种变量就已赋上了初值,而其余的变量只能在程序运行时才能得到其值!
2.这个值放在EXE的文件中!
3.在程序未运行时这个变量的值是不存在的,只是以汇编代码的形式在EXE文件中,当程序运行到此行的时候就由此汇编代码将其赋值.
4.编译时赋值对于程序来说运行的速度要快一些(不过对于现在的机器来说可以不用考虑:))

偶觉得你得看看PE结构的书就会明白一些的!:)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧