c - 跳入 C 中的一个 block

标签 c static goto

如果我像这个例子一样跳进一个 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> 达到。

但不知何故你可以跳过定义...

  1. st 作为一个静态变量被初始化为值 -9 并且计数到 0。
  2. 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/

相关文章:

c - char* a、char * a 和 char *a 之间有区别吗?

c - 使用 C 中的 Do..while 循环登录

c++ - OpenGL 抗锯齿不起作用

java - 从对象数组列表中调用方法

sql - 在什么情况下可以使用 T-SQL GOTO 语句?

c++ - 在这种情况下我应该避免使用 "goto"吗?

c++ - 使用 goto 进行优化

c - C语言声明错误,有返回值

c - 将局部静态数组传递给函数

java - 如何使用静态 block 初始化spring hibernate查询功能