为什么跳入标量类型的对象范围而没有初始值设定项是可以的? 当我阅读C++标准时,按照标准,下面的代码看起来是完美的。 int main() { goto lol; { int x; lol: cout << x << endl; } } // OK intmain(){ 后藤笑; { int x; 大声笑: 无论如何,你都可以使用未初始化的x,因为int x;是未初始化的。初始化器的存在当然会有所不同,因为你会跳过它。例如,int x=5;初始化x,所以如果你跳过它,就会产生不同

为什么跳入标量类型的对象范围而没有初始值设定项是可以的? 当我阅读C++标准时,按照标准,下面的代码看起来是完美的。 int main() { goto lol; { int x; lol: cout << x << endl; } } // OK intmain(){ 后藤笑; { int x; 大声笑: 无论如何,你都可以使用未初始化的x,因为int x;是未初始化的。初始化器的存在当然会有所不同,因为你会跳过它。例如,int x=5;初始化x,所以如果你跳过它,就会产生不同,c++,goto,C++,Goto,跳过它的定义,使用未初始化的x,这难道不是很危险吗 但是x无论如何都不会初始化,因为它是在没有初始值设定项的情况下声明的!因此goto可能会跳过设置的赋值语句(有点初始化)x,但是goto可以跳过赋值语句也就不足为奇了;除非有初始值设定项,否则声明本身实际上不会做任何事情。但问题是,不管有没有初始值设定项,x都没有定义,因为它的定义被忽略了。不是吗?@EricZ:定义仍然存在rs.goto是一个运行时的东西,它只跳过运行时行为,比如初始化。+1声明本身实际上什么都不做。这是关键点。没有初始值设定

跳过它的定义,使用未初始化的
x
,这难道不是很危险吗


但是
x
无论如何都不会初始化,因为它是在没有初始值设定项的情况下声明的!因此
goto
可能会跳过设置的赋值语句(有点初始化)
x
,但是
goto
可以跳过赋值语句也就不足为奇了;除非有初始值设定项,否则声明本身实际上不会做任何事情。

但问题是,不管有没有初始值设定项,x都没有定义,因为它的定义被忽略了。不是吗?@EricZ:定义仍然存在rs.
goto
是一个运行时的东西,它只跳过运行时行为,比如初始化。+1声明本身实际上什么都不做。这是关键点。没有初始值设定项,就不会生成代码。规则确保您不会跳过任何代码。@Ernest,我很好奇x是如何定义的,因为它的定义是pa塞住?想象一下,一个空闲的处理器寄存器被指定用来存放
x
。这只是编译器中的簿记;在生成的代码中,没有任何物理内容表明“寄存器17现在是
x
”现在,如果
x
被初始化,我们将有代码来设置寄存器的值——但正如我们所说的,这些都没有。@Ernest,现在对我来说有意义了,谢谢你的评论;)