如果我像这个例子一样跳进一个块,“跳过”声明,
#include <stdio.h>
int main(int argc, char *argv[]){
int counter = 0;
goto jump;
{
static int st = -9;
int au = -9;
jump:
printf("st = %d\n", st);
printf("au = %d\n", au);
au++;
st++;
counter++;
}
if(counter < 10) goto jump;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我可以用 来编译它gcc --std=c89 -pedantic
。
似乎您无法真正“跳过”声明:即使从未到达进行这些声明的行,变量仍然被声明。
但不知何故你可以跳过定义......
st
作为静态变量,它被初始化为值 -9 并计数到 0。au
使用值 0 进行初始化并计数到 9。1. 和/或 2. 是 C 标准所必需的行为吗?
在 C 中,静态变量在调用st
之前在程序启动时初始化main()
,即使对于作用域为函数或块的静态变量也是如此。跳过声明/初始化程序不会影响这一点,因此对于这种特定场景,不会发生未定义、未指定或不确定的行为。
对于自动变量,例如au
,当在块的执行中到达声明时就会进行初始化。由于goto
跳过了块执行的该部分,因此 的值au
仍然是不确定的,并且在这种情况下使用变量的值而不首先将其设置为某个确定值是未定义的行为。
请注意,C++ 中的一些细节有所不同。例如,C++ 标准规定,如果程序跳过声明,则该程序是格式错误的,除非该声明适用于 POD 类型并且该声明不包含初始值设定项。