正在初始化一个真正初始化的垃圾变量,或者只是一个赋值
Is initializing a garbage variable truly initializing or just an assignment?
我通常看到初始化与赋值的示例,如下所示:
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被初始化为垃圾,有很多技术原因吗",好吧,如果你不在内存位置中放入任何值,那就不是"初始化"。从编译器的角度来看,没有生成任何机器语言指令来写入该位置,因此不会发生任何事情。
- 构造函数在退出函数时无法初始化一个参数
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- C++:将初始化的对象传递给另一个类的构造函数;需要不必要的构造函数吗?
- 将另一个类的对象传递到当前类C++的构造函数中(不是成员初始化)
- 'auto *x = new some_struct{};"是一个未初始化的变量?
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 初始化类中的指针数组,并在另一个类中检索它
- C++,每个循环初始化一个新的静态变量
- 初始化一个由 p 指向的新 INTSTK,它最多可以存储 m 个
- 如何初始化一个标准::字符串数组?
- 我们如何初始化一个C++中所有值为 0 的向量
- C++ 警告:在一个声明中将截断从双精度初始化为浮点数,但在另一个声明中则不初始化
- 从C++调用 Python 类方法,如果给定一个初始化的类作为 PyObject
- C++11使variadic构造函数了解一个初始化列表的初始化列表
- 静态变量已用另一个初始化
- 与可以一个从另一个初始化的类的循环依赖关系
- 另一个初始化静态 C++ 类成员