C里面局部变量需要显式初始化,谁能解释编译器为什么这样设计?

C0001 2008-07-11 08:33:00
我是指最初设计者的初衷,为什么局部变量一定要赋初值,否则编译不通过;
这个问题可能涉及比较多的东东,当然如果是效率的话,请说明一下具体的原因。
这里仅仅以C语言为举例。
...全文
508 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2008-07-14
  • 打赏
  • 举报
回复
这是因为效率,因为java安全,所以Java慢.
想想看,"栈中的数据在运行时也能初始化,编译器能生成 mov dword ptr [ebp-4],0 这样的语句,运行时执行的指令也是编译器生成的"
在C中,我就是要 int a; a = 1; 那么C编译出来就是一条汇编指令,而用Java的方式呢?不就等于 int a; a=0; a=1;了吗?
编译器的行为就是按语言的设计来实现的.
但是,语言设计者也必须考虑自己的语言能不能方便编译器的设计.
C语言的生命就是效率,就是把自由交给程序员.
过去的我 2008-07-14
  • 打赏
  • 举报
回复
Java automatically initialises all non-local variables with a default value, i.e. 0 or null, even chars. However Java does not automatically initialise local variables, though it will initialise any arrays or objects newly created to be stored in local variables. The Java compiler is clever. If you forget to initialise when it is required, it will tell you at compile time.
过去的我 2008-07-14
  • 打赏
  • 举报
回复
我也不是凭空说说的,搜索了很多资料,然后其中也可能是不对的,但和有些人没动手下个demo编译运行就乱说还是有区别的

1. 局部变量不赋值很容易出错,java编译器这么规定也是安全的一部分,21楼你难道认为编译器行为与java语言没有联系?

2 栈中的数据在运行时也能初始化,编译器能生成 mov dword ptr [ebp-4],0 这样的语句,运行时执行的指令也是编译器生成的
yyyapple 2008-07-14
  • 打赏
  • 举报
回复
这就是c,c++的灵活之处,不知道是优点还是缺点,反正给了程序设计者更大的自由,在编译器认为必须的情况下(如果不这样就违背了语言设计的初衷)会在背后给你添加一些初始化代码,否则自己的事情自己做
C0001 2008-07-14
  • 打赏
  • 举报
回复
还在疑惑中:为什么C、C++局部变量可以不赋初值就可以编译通过,sun的JAVA就不允许。

语言的设计者应该注意到一点,但是不知道他们怎么考虑这个问题的。
agurick 2008-07-14
  • 打赏
  • 举报
回复
没什么高深的,其实很简单,这是出于效率方面的考虑,因为局部变量如果要初始化,也是要在运行时初始化, 所以如果要达到楼主的目的,编译器需要加入额外初始化代码才能完成。对于c语言这种极关心效率及灵活性的语言来说,目前的状况是合理的。
ForestDB 2008-07-14
  • 打赏
  • 举报
回复
在早期(语言与编译器的早期),局部变量是没有初始化的(编译器实现起来简单,也比较有效率),它的值是“垃圾”,取决于当前内存的状态。
但很明显,如果你忘了显式的初始化一个变量,最后的结果会是不正确的(逻辑错误),所以随着语言和编译器的发展,出现了编译器会给出个警告,告诉你这里变量没有初始化(可能会导致(逻辑)错误),或者干脆从语法上定义变量一定要初始化(如Java)。
逸学堂 2008-07-14
  • 打赏
  • 举报
回复
java是解释性语言(也有种说法是解释+编译性语言),不会像C/C++之类的语言一样,
需要最终转化为汇编语言,所以我认为站在C/C++方面去理解java的原理是不可取的。

个人认为
java是标榜安全性的语言,并且是完全面向对象的语言。所以java的任何变量,其实都是一个对象,对于对象
就应该是真实构造且初始化的,而C/C++中声明变量,只是起到“占位符”的作用,不然和它的定位就有矛盾了,
至于局部变量要求初始化,可能是给用户更好的提示,防止声明对象后,使用未初始化的对象,造成运行时
错误,所以个人认为这个问题,不是技术因素的问题,而是语言定位的原因。
e_sharp 2008-07-14
  • 打赏
  • 举报
回复
C没有这个规定
「已注销」 2008-07-12
  • 打赏
  • 举报
回复
好像前面还没有正解出现,越扯越远了,我来说说.
在编译器进行编译的时候,由于临时变量一般是存放在栈中的,也就是程序在运行时候才为临时变量分配内存,编译器根本没有办法对临时变量赋初始值.而全局变量是在编译阶段就分配内存,编译器在编译时就知道这个变量在哪里,当然可以对他进行初始化.
如果还有不理解的,请自学或复习编译原理.
tangtang02520 2008-07-12
  • 打赏
  • 举报
回复
学习
ChamPagneZ 2008-07-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 aca_jingru 的回复:]
sum的规定,这样会安全一点
[/Quote]
只是为了安全.
C标准没有说必须,那么JAVA也差不多吧?
显示初始化是编译器的行为.
关语言鸟事.
过去的我 2008-07-11
  • 打赏
  • 举报
回复
sun..打错了
过去的我 2008-07-11
  • 打赏
  • 举报
回复
sum的规定,这样会安全一点
xkyx_cn 2008-07-11
  • 打赏
  • 举报
回复
拥有static存储类型的变量,如果没有提供初始值,则会初始化为0
C是这样描述的:
pointer is null pointer
arithmetic type is zero
aggregate type according to these rules
the first named member of union according to these rules

C++ 有个zero-initialization,意思类似

[Quote=引用 12 楼 iidioter 的回复:]
引用 5 楼 xkyx_cn 的回复:
全局静态变量会赋初值,局部的则不会

编译器可能会给你个警告什么的,但我用过的编译器都没给错误信息


静态局部对象会被程序自动初始化为0.

综合下....
应该是静态变量,不管是全局的还是局部的,都应该会被初始化...
(这个特性提供了一种数据共享的方式).
[/Quote]
hai040 2008-07-11
  • 打赏
  • 举报
回复
应该没什么原理,不可能不赋初值java就实现不了
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 DarknessTM 的回复:]
C语言没有规定一定要初值吧,只是你不给初值就读取操作的话,内容是不确定的
[/Quote]
so要养成好习惯,使用之前记得初始化
iBug168 2008-07-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xkyx_cn 的回复:]
全局静态变量会赋初值,局部的则不会

编译器可能会给你个警告什么的,但我用过的编译器都没给错误信息
[/Quote]

静态局部对象会被程序自动初始化为0.

综合下....
应该是静态变量,不管是全局的还是局部的,都应该会被初始化...
(这个特性提供了一种数据共享的方式).
DarknessTM 2008-07-11
  • 打赏
  • 举报
回复
不是内存资源问题
因为变量初始值并不一定是必须的
比如

char s[100];

strcpy(s,"this is a test");

在这种情况下,强制给 s 初始值没有任何意义
C0001 2008-07-11
  • 打赏
  • 举报
回复
抱歉,各位大拿,这里我记错了。进行更正。

首先我再说明一下,我用的几个环境是:
JAVA:JBuilder2005 winXP
C++:Vc 6.0 winXP
C:solaris 8 CC&&cc

1/在JAVA下面,编译是不通过的,也是我这次想弄清楚的问题;“int x”出现错误;代码如下:
public static void main(String args[])
{
int x = 0 ;
System.out.println("Value is " + x);
}

private void dd ()
{
int x ; --- 这里出现错误。
x = x+9;
}

2/在C++下面是OK的,有警告
3/在C下面,都OK;CC有警告,建议赋初值;cc没有警告。

其实我的原意是想研究JAVA下面的局部变量需要赋值的问题,也就是问题1;因为涉及底层东西很多,特别是编译器的东西,所以就在C、C++专区发了帖子;这里让大家在c上忙活了半天很是抱歉。如果哪位能解答出JAVA下面的原理,就实在太好了。
加载更多回复(11)

69,336

社区成员

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

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