我通常会看到初始化与分配的示例,如下所示:
int funct1(void)
{int a = 5; /*initialization*/
a = 6;} /*assignment*/
显然,垃圾或未定义的东西在某种程度上是未初始化的。
但有人可以定义是否为定义语句保留初始化和/或是否可以将赋值称为初始化?
int funct2(void)
{int b;
b = 5;} /*assignment, initialization or both??*/
为什么我们不能说int b被初始化为垃圾(从编译器的角度来看)是否有很多技术原因?
如果可能的话,可以将其与初始化和分配非原始数据类型进行比较。
答案 0 :(得分: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}}在分配之前未初始化,但不在之后。术语赋值和初始值设定项是语法定义的,但“初始化”和“未初始化”等术语通常用于指代语义(在某种非正式用法中)。 [感谢Keith Thompson的最后一段]。
我不喜欢这个模糊的术语,但是应该意识到它已经被使用了,唉,并不是太罕见。
答案 1 :(得分:4)
就语言标准而言,只有int a = 5;
形式的陈述才是初始化。 b = 5;
形式的所有内容都是作业。
非原始类型也是如此。
答案 2 :(得分:0)
并且“为什么我们不能说int b被初始化为垃圾有很多技术原因”,好吧,如果你没有将任何值放入内存位置,那么它不是“初始化”。从编译器的角度来看,没有生成机器语言指令来写入该位置,因此没有任何反应。