如果我跳进这个例子中的块,跳过声明,

#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编译它。
似乎您不能真正跳过“over”声明:变量仍然被声明,即使这些声明所在的行从未到达。
但不知怎的你可以跳过定义。。。
st作为一个静态变量,用值-9初始化并计数为0。
au使用值0初始化,最多计数9。
是1。和/或2。C标准要求的行为?

最佳答案

在C语言中,静态变量,如st在调用main()之前在程序启动时初始化,即使对于作用域为函数或块的静态变量也是如此。跳过声明/初始值设定项不会影响此操作,因此对于此特定场景,不会发生未定义、未指定或不确定的行为。
对于自动变量,例如au,当在执行块时达到声明时,就会进行初始化。由于goto跳过了块执行的那一部分,au的值仍不确定,因此在这种情况下使用变量值而不首先将其设置为某个确定值是未定义的行为。
请注意,这几个细节在C++中是不同的。例如,C++标准称如果一个程序跳过一个声明,除非该声明是一个POD类型,并且声明不包含一个初始化器,那么它就形成了一个错误的程序。

关于c - 跳入C语言块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36074896/

10-10 09:26