初始化垃圾变量是真正初始化还是只是一个赋值?

sab*_*ton 3 c c++

我通常会看到初始化与赋值的示例,如下所示:

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被初始化为垃圾(从编译器的角度来看)?

如果可能的话,这可以与初始化和分配非原始数据类型进行比较.

Lor*_*ica 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
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的最后一段].

我不喜欢这个模糊的术语,但是应该意识到它被使用了,唉,并不是太罕见.