如果我像这个例子一样跳进一个 block ,跳过声明,
#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;
}
我可以用 gcc --std=c89 -pedantic
编译它。
似乎您无法真正“跳过”声明:变量仍然是声明的,即使进行这些声明的行从不 em> 达到。
但不知何故你可以跳过定义...
st
作为一个静态变量被初始化为值 -9 并且计数到 0。au
被初始化为 0 并计数到 9。
1. 和/或 2. 是 C 标准所必需的行为吗?
最佳答案
在 C 中,诸如 st
之类的静态变量在调用 main()
之前在程序启动时进行初始化,即使对于作用域为函数或 block 的静态变量也是如此。跳过声明/初始化程序不会影响这一点,因此对于这种特定情况,不会发生未定义、未指定或不确定的行为。
对于一个自动变量,例如au
,初始化发生在 block 执行中到达声明时。由于 goto
跳过了 block 执行的那部分, au
的值仍然不确定,在这种情况下使用变量值而不先设置它是未定义的行为到某个确定的值。
请注意,这方面的一些细节在 C++ 中有所不同。例如,C++ 标准规定,如果程序跳过声明,则该程序是非良构的,除非该声明针对 POD 类型并且该声明不包含初始化程序。
关于c - 跳入 C 中的一个 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36074896/