让我们考虑以下代码:
#include <stdio.h>
int main(){
int size,i;
scanf("%d",&size);
int x[size];
for(i=0;i<size;i++){
x[i] = i;
}
for(i=0;i<size;i++){
printf("%d\n", x[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为有些版本无法使用定义变量大小的变量声明数组,例如:
int x[size];
Run Code Online (Sandbox Code Playgroud)
但是我不确定是哪个版本。这在所谓的ANSI C中是允许的吗?
在C89 / C90中,即使将维数更改为编译时间常数,也无法交错声明和语句,例如将int x[size];声明(定义)放在scanf()— 后面。
在C89 / C90中,您不能使用可变长度的数组-由于该int x[size];定义size不是编译时间常数,因此该定义不合法。
C99编译器需要在函数的(几乎)任意点处支持声明(它们仍然不能带有标签)和可变长度数组(VLA)定义。
C11编译器需要在函数中的任何地方(几乎)支持变量定义。C11编译器可以选择支持VLA(第6.10.8.3条条件功能宏和第6.7.6.2节数组声明符),并应定义__STDC_NO_VLA__它们是否不支持VLA。
在此讨论的所有方面,C18均等效于C11。
仅作记录:
当然,X3.159-1989唯一不寻常的事情是它是在有ISO标准之前由ANSI发布的。但是,ANSI以及其他国家标准机构(例如BSI(英国标准协会)和DIN(德国规范协会或德国标准化研究所))也都采用了每个后续的ISO标准。
还存在于1994年完成并于1995年发布的修正案1(针对ISO 9899:1990)。该修正案添加了标题并引入了有向图,并对其他内容进行了其他更改。几乎从来没有单独考虑过它,尤其是25年后的现在。
请注意,GCC将-ansi选项等同于-std=c90,这会导致术语混淆。ANSI最初比ISO早一年发布了“ ANSI C标准”,但目的总是要有一个通用标准,并且ANSI在发布时认可了ISO 9899:1990标准。
ANSI-C (C89)不允许使用变量初始化数组。
例如:
int x = 5;
int ia[x];
Run Code Online (Sandbox Code Playgroud)
上面的例子是非法的。ANSI-C 将数组初始化大小限制为常量。但是,您可以使用宏来定义数组的长度。
例子:
#define MAX_ARRAY_SIZE 5
int ia[MAX_ARRAY_SIZE];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |