我正在尝试在goto的情况下学习POD的行为。以下是我使用的程序:
#include <iostream>
void f(int i){
if (i < 10)
goto jump1;
int j;
jump1:
std::cout << j;
}
int main()
{
f(9);
}
为什么j
初始化为0?
答案 0 :(得分:1)
在标准中没有任何东西可以将本地非静态变量初始化为零,它只是编译器的自定义/随机行为。从未初始化的变量中读取值可以调用未定义的行为。 goto
与该声明无关。
答案 1 :(得分:1)
goto
跳跃本身很好。通过[stmt.dcl] / 3:
可以转换为块,但不能以初始化绕过声明的方式。从具有自动存储持续时间的变量不在范围内的点跳转到其在范围内的点的程序是不正确的,除非变量具有标量类型[...]并且在没有初始化程序的情况下声明(8.5)
然而,不合法的是通过[dcl.init]读取未初始化的变量,因此如果使用参数较少调用f
,则程序在运行时具有未定义的行为比10。