2012-03-18 32 views
3

我一般看到初始化的例子VS分配是这样的:正在初始化一个垃圾变量真正初始化或只是一个任务?

int funct1(void) 
{int a = 5; /*initialization*/ 
a = 6;}  /*assignment*/ 

显然有些剩余垃圾或未定义不知何故未初始化。

但是,有人可以定义初始化是否为定义语句保留和/或赋值是否可以称为初始化?

int funct2(void) 
{int b;  
b = 5;}  /*assignment, initialization or both??*/ 

也有很大的技术原因,我们不能说INT B为(从视编译点)初始化为垃圾?

此外,如果可能的话,这可以与初始化和分析非基元数据类型进行比较。

+3

垃圾变量? – 2012-03-18 11:47:02

+0

int b;只包含垃圾,就是我的意思。 – sabgenton 2012-03-18 12:17:28

回答

4

就语言标准而言,只有形式为int a = 5;的陈述是初始化。一切形式b = 5;是一项任务。

非原始类型也是如此。

+1

是的,这是有道理的声明我听到像“你可以分配给一个const变量,而你可以 初始化它。” – sabgenton 2012-03-18 11:52:13

+0

你可以改变int b = 5为int a = 5,以便它符合我的问题(除非它减损你的说法)? – sabgenton 2012-03-18 12:00:12

+0

@sabgenton:当然, – 2012-03-18 12:00:46

0

而且“为什么我们不能说int b被初始化为垃圾”这个技术原因有很多,如果你没有将任何值放入内存位置,那就不是“初始化”。从编译器的角度来看,没有机器语言指令生成写入该位置,所以没有任何反应。

+0

我仍然可以在b中显示随机垃圾值,编译器会在处理b时做什么或警告我什么? (因为它知道没有机器语言指令已被写入到您指定的位置) – sabgenton 2012-03-18 12:30:36

+0

不,没有警告。如果你想做坏事,完全取决于你。 C++不会牵着你的手,就像我可以命名的其他一些语言一样。 – 2012-03-18 13:41:41

+2

@sabgenton至少如果您将警告级别提高,一个好的编译器会警告您使用未初始化的变量。 – 2012-03-18 14:20:26

5

我会复活此主题以添加重要观点,因为OP对术语的困惑是可以理解的。正如@OliCharlesworth所指出的(并且他完全正确),就C语言标准而言,初始化和赋值是两个完全不同的东西。例如(假设本地范围内):

int n = 1; // definition, declaration and **initialization** 
int k;  // just definition + declaration, but no initialization 
n = 12;  // assignment of a previously initialized variable 
k = 42;  // assignment of a previously UNinitialized variable 

的问题是,教编程的很多书都没有那么挑剔术语,所以他们称之为“初始化”任何给一个变量的第一个有意义的价值“手术” 。因此,在上面的示例中,n = 12不会是初始化,而k = 42会。当然,这个术语是模糊的,不精确的,可能会引起误解(尽管它经常被使用,特别是老师在向新手介绍程序​​时)。作为这种不确定性的一个简单的例子,让我们改写前面的例子中考虑全球范围内考虑:

// global scope 
int n = 1; // definition, declaration and **initialization** 
int k;  // definition, declaration and **implicit initialization to 0** 

int main(void) 
{ 
    n = 12;  // assignment of a previously initialized variable 
    k = 42;  // assignment of a previously initialized variable 

    // ... other code ... 
} 

你会说什么在main的任务?第一个显然只是一个任务,但是根据模糊的通用术语,它是第二次初始化吗?默认值0是否给k第一个“有意义”的值?

此外,一个变量是通常说如果没有初始化或分配已被应用到它未初始化。鉴于:

int x; 
x = 42; 

一会常用x被转让之前未初始化,而不是之后。术语赋值初始化程序在语法上被定义,但是像“初始化”和“未初始化”的术语经常被用来指代语义(在某种非正式用法中)。 [感谢基思汤普森最后一段]。

我不喜欢这个模糊的术语,但应该意识到它被使用了,唉,不是很少见。

+1

而且一个变量通常被认为是*未初始化的*如果没有初始化*或赋值被应用到它。鉴于:'int x; x = 42;''''''''通常会说'x'在赋值之前是*未初始化的,但在它之后没有初始化。术语*赋值*和*初始值赋值*在语法上被定义,但是像“初始化”和“未初始化”这样的术语经常被用来指代语义(在某种非正式的用法中)。 – 2013-09-12 19:51:08

+0

@KeithThompson感谢您的有益补充!它真的完成了我想传达的图片! – 2013-09-12 19:54:19

+0

随意将其纳入您的答案。 – 2013-09-12 20:06:12