正在初始化一个真正初始化的垃圾变量,或者只是一个赋值

Is initializing a garbage variable truly initializing or just an assignment?

本文关键字:一个 初始化 或者 赋值 变量      更新时间:2023-10-16

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

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

显然,以某种方式保留为垃圾或未定义的东西是未初始化的。

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

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

为什么我们不能说int b被初始化为垃圾(从编译器的角度来看),这有很多技术原因吗?

如果可能的话,这也可以与初始化和辅助非原始数据类型进行比较。

我将重新启动这个线程来添加一个重要的观点,因为OP对术语的困惑是可以理解的。正如@OliChalesworth所指出的(他完全正确),就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中的作业有什么看法?第一个显然只是一个赋值,但根据模糊的通用术语,第二个是初始化吗?给k的默认值0是否是它的第一个"有意义"值?

此外,如果没有初始化或赋值,变量通常被称为未初始化。给定:

int x; 
x = 42; 

通常会说x在赋值之前未初始化,但在赋值之后未初始化。术语赋值初始化器是语法定义的,但"初始化"answers"未初始化"等术语通常用于指代语义(在某种非正式用法中)。[感谢Keith Thompson最后一段话]。

我不喜欢这种模糊的术语,但人们应该意识到,它是被使用的,唉,并不太罕见。

就语言标准而言,只有形式为int a = 5;的语句才是初始化。b = 5;形式的所有内容都是赋值。

非基元类型也是如此。

对于"为什么我们不能说int b被初始化为垃圾,有很多技术原因吗",好吧,如果你不在内存位置中放入任何值,那就不是"初始化"。从编译器的角度来看,没有生成任何机器语言指令来写入该位置,因此不会发生任何事情。