我一直认为在C中,所有变量都必须在函数的开头声明.我知道在C99中,规则与C++中的规则相同,但C89/ANSI C的变量声明放置规则是什么?
以下代码使用gcc -std=c89和成功编译gcc -ansi:
#include <stdio.h>
int main() {
int i;
for (i = 0; i < 10; i++) {
char c = (i % 95) + 32;
printf("%i: %c\n", i, c);
char *s;
s = "some string";
puts(s);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
不应该在C89/ANSI模式下声明c并s导致错误吗?
我听说(可能来自老师)应该在程序/函数之上声明所有变量,并且在语句中声明新变量可能会导致问题.
但后来我正在阅读K&R,我发现了这句话:"变量的声明(包括初始化)可能会在左括号后面引入任何复合语句,而不仅仅是开始函数的语句".他举了一个例子:
if (n > 0){
int i;
for (i=0;i<n;i++)
...
}
Run Code Online (Sandbox Code Playgroud)
我玩了一下这个概念,它甚至可以用于数组.例如:
int main(){
int x = 0 ;
while (x<10){
if (x>5){
int y[x];
y[0] = 10;
printf("%d %d\n",y[0],y[4]);
}
x++;
}
}
Run Code Online (Sandbox Code Playgroud)
那么当我不允许声明变量时呢?例如,如果我的变量声明不在开括号之后呢?像这儿:
int main(){
int x = 10;
x++;
printf("%d\n",x);
int z = 6;
printf("%d\n",z);
}
Run Code Online (Sandbox Code Playgroud)
这可能导致麻烦,具体取决于程序/机器吗?