C++ 初始化垃圾变量是真正的初始化还是仅仅是赋值?

C++ 初始化垃圾变量是真正的初始化还是仅仅是赋值?,c++,c,C++,C,我通常看到初始化与分配的示例如下: int funct1(void) {int a = 5; /*initialization*/ a = 6;} /*assignment*/ 很明显,一些作为垃圾或未定义的东西是未初始化的 但是,是否有人可以定义是否为定义语句保留初始化和/或是否可以将赋值称为初始化 int funct2(void) {int b; b = 5;} /*assignment, initialization or both??*/ 我们不能说int

我通常看到初始化与分配的示例如下:

int funct1(void)
{int a = 5; /*initialization*/
a = 6;}     /*assignment*/
很明显,一些作为垃圾或未定义的东西是未初始化的

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

int funct2(void)
{int b;     
b = 5;}     /*assignment, initialization or both??*/
我们不能说int b被初始化为垃圾(从编译器的角度来看)有很多技术原因吗


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

就语言标准而言,只有
int a=5正在初始化。所有形式的
b=5是一项作业


非原语类型也是如此。

还有“我们不能说int b初始化为垃圾有很大的技术原因吗”,如果你不把任何值放入内存位置,那就不是“初始化”。从编译器的角度来看,没有生成写入位置的机器语言指令,因此不会发生任何事情。

我将重新启动此线程以添加一个重要的观点,因为OP对术语的困惑是可以理解的。正如@OliCharlesworth所指出的(他在这一点上完全正确),就C语言标准而言,初始化和赋值是两件完全不同的事情。例如(假设本地范围):

问题在于,许多教授编程的书籍对术语并不挑剔,所以他们称“初始化”为任何赋予变量第一个有意义值的“操作”。因此,在上面的示例中,
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
在赋值之前未初始化,但在赋值之后未初始化。术语赋值和初始值设定项是按语法定义的,但诸如“初始化”和“未初始化”之类的术语通常用于指代语义(在一些非正式用法中)。[感谢基思·汤普森的最后一段]


我不喜欢这个模糊的术语,但应该知道它被使用了,而且,唉,也不太少见。

是的,这在语句中是有意义的,我听到这样的话:“你不能分配一个常量变量,而你可以初始化它。”你能把int b=5改为int a=5,这样它就符合我的问题了(除非它偏离了你的说法)?谢谢:),所以我们是说b=5使b被分配但没有初始化lol吗?真的吗?如果一本书说“b还没有初始化”,我会认为这是疯狂的。你见过这种类型的语言吗?我猜b注定永远不会被初始化;我的意思是只包含垃圾。我仍然可以在b中显示随机垃圾值,当我处理b时,编译器会做什么或警告我什么?(据它所知,没有生成任何机器语言指令来写入您所指出的位置)没有,没有警告。如果你想做坏事,那完全取决于你。C++没有你的手,我可以用其他语言来命名。@沙顿顿,至少如果你把警告级别提高了,一个好的编译器会警告你使用未初始化的变量。如果没有初始化或赋值,变量通常被称为未初始化。给定:
intx;x=42
人们通常会说,
x
在赋值之前未初始化,但在赋值之后未初始化。术语赋值和初始值设定项是按语法定义的,但诸如“初始化”和“未初始化”之类的术语通常用于指代语义(在某种非正式用法中)。@KeithThompson感谢您的有用添加!这真的完成了我想要传达的画面!请随意将其纳入您的答案。@KeithThompson我会的。谢谢我想正确的做法是投票给你,同时与奥利·查尔斯沃思保持联系D
int x; 
x = 42;