Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C11是否允许在函数中的任何位置声明变量?_C_C11_Variable Declaration - Fatal编程技术网

C11是否允许在函数中的任何位置声明变量?

C11是否允许在函数中的任何位置声明变量?,c,c11,variable-declaration,C,C11,Variable Declaration,C11标准(注意,我不是指C++11)允许您在函数中的任何位置声明变量吗 以下代码在ANSI C(C89、C90)中无效: C11中的源代码有效吗?是。这在C99中已经有效(参见第二个项目符号)。或多或少。C99引入了通过块和for循环的第一部分声明变量的功能,C2011继续了这一功能 void c99_or_later(int n, int *x) { for (int i = 0; i < n; i++) // C99 or later { prin

C11标准(注意,我不是指C++11)允许您在函数中的任何位置声明变量吗

以下代码在ANSI C(C89、C90)中无效:


C11中的源代码有效吗?

是。这在C99中已经有效(参见第二个项目符号)。

或多或少。C99引入了通过块和
for
循环的第一部分声明变量的功能,C2011继续了这一功能

void c99_or_later(int n, int *x)
{
    for (int i = 0; i < n; i++)  // C99 or later
    {
         printf("x[%d] = %d\n", i, x[i]);
         int t = x[i];           // C99 or later
         x[0] = x[i];
         x[i] = t;
    }
}

为什么它不是有效的ANSI C?ANSI是否以某种方式拒绝更新其国家标准以遵循C99?如果您正确理解ANSI C的含义,ANSI C是否有效。ANSI将标准井更新为最新版本。不幸的是,在城市俚语中,“ANSI C”一词被错误地固定在C 89上。@JensGustedt:另一种看待它的方式是,ANSI C确实是C89,但自1990年以来,该标准一直是ISO C,ANSI已经认可ISO C为标准。ISO C 90和ANSI C 89之间的区别在于章节编号AFAIK;否则,文本不变。但这是令人毛骨悚然的。GCC使用
-ansi
作为
-std=c89
的同义词,不识别
-std=c90
(但大多数GCC版本识别
std=c99
,一些最新版本识别
-std=c11
)。POSIX过去需要一个
c89
C编译器;它目前需要一个
c99
编译器,因为它尚未修订。
void c99_or_later(int n, int *x)
{
    for (int i = 0; i < n; i++)  // C99 or later
    {
         printf("x[%d] = %d\n", i, x[i]);
         int t = x[i];           // C99 or later
         x[0] = x[i];
         x[i] = t;
    }
}
label: ;
    int a = 5;