我通常会看到初始化与赋值的示例,如下所示:
int funct1(void)
{int a = 5; /*initialization*/
a = 6;} /*assignment*/
Run Code Online (Sandbox Code Playgroud)
显然,垃圾或未定义的东西在某种程度上是未初始化的.
但有人可以定义是否为定义语句保留初始化和/或是否可以将赋值称为初始化?
int funct2(void)
{int b;
b = 5;} /*assignment, initialization or both??*/
Run Code Online (Sandbox Code Playgroud)
是否有很多技术上的原因我们不能说int b被初始化为垃圾(从编译器的角度来看)?
如果可能的话,这可以与初始化和分配非原始数据类型进行比较.
我将复活这个帖子以增加一个重要的观点,因为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
Run Code Online (Sandbox Code Playgroud)
问题在于许多教授编程的书籍并不那么挑剔术语,因此他们将"初始化"称为任何"操作",赋予变量第一个有意义的值.因此,在上面的例子中,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 ...
}
Run Code Online (Sandbox Code Playgroud)
你对这些作业有main什么看法?第一个显然只是一个任务,但根据模糊的通用术语,它是第二个初始化吗?是否将默认值0赋予k其第一个"有意义"值?
此外,如果没有对其应用初始化或赋值,则通常认为变量是未初始化的.鉴于:
int x;
x = 42;
Run Code Online (Sandbox Code Playgroud)
人们通常会说x在转让之前未初始化,但不是在转让之后.术语赋值和初始化器是在语法上定义的,但是诸如"初始化"和"未初始化"之类的术语通常用于指代语义(在某种非正式用法中).[感谢Keith Thompson的最后一段].
我不喜欢这个模糊的术语,但是应该意识到它被使用了,唉,并不是太罕见.