C初学者向各位高手请教关于“变量作用域”的问题

来源:百度知道 编辑:UC知道 时间:2024/06/03 00:33:22
现在做一个冒泡排序算法

# include <stdio.h>
void main()
{
char a[10] ={'d','m','s','a','q','e','r','e','o','p'};

int m ,n;

for(m=0;m <10;m++)
for(n=0;n <10-m;n++)
{
char b;

if (a[n+1]>a[n])
{
b=a[n];
a[n] = a[n+1];
a[n+1] = b;

}

}

int p=0; // <----------------p 的位置
while(p <10)
{
printf("%c ",a[p]);
p++;
}/**/
}

这个时候程序就会报错,如果把变量P放置于程序首部,则不会报错

# include <stdio.h>
void main()
{
char a[10] ={'d','m','s','a','q','e','r','e','o','p'};

int m ,n;
int p=0; // <----------------p 的位置

for(m=0;m <10;m++)
for(n=0;n <10-m;n++)
{
char b;

问题关键是:在C语言的标准用法中,不允许在表达式运算、输出等操作之后再进行变量的定义。这是不合法的。
如:
...
int a =0;
prinf("a= %d", a);
int b;
prinf("a= %d", a);
这样在C语言中就是不合法的,存在你上面的错误。
(补充一点,而在C++中允许这样定义)

但是
...
int a =0;
int b;
prinf("a= %d", a);
prinf("a= %d", a);
在C语言中才是正确的,是合法的。

同时告诉你在C语言中还有个小技巧可以突破之中限制,不如上面的语句变成下面的样子就是正确的了:
...
int a =0;
prinf("a= %d", a);

{
int b;
prinf("a= %d", a);
}
看见了吧,就是多了一对大括号而已,很神奇吧,呵呵。
这是因为C语言中认为{}里面又是一个开始,不过有时候可能有ISO90...的警告而已,这个无影响。

同样,你上面的代码在出错位置加一对大括号就OK了,代码如下:

# include <stdio.h>
void main()
{
char a[10] ={'d','m','s','a','q','e','r','e','o','p'};

int m ,n;

for(m=0;m <10;m++)
fo