一个变量名重复的问题--全局变量与局部变量的关系
今天被问到一段程序
//输出区间[a,b]中的素数
#include<stdio.h>
int main(void){
int a,b,c,i;
scanf("%d %d",&a,&b);
for(c=a;c<=b;++c){
for(int i=2;i<=c-1;++i){
if(c%i==0)
break;
}
if(c==i)printf("%d\n",c);//如果for是正常结束的,说明是素数
}
return 0;
}
可以看到这里的i被申请了两次
在Dev上,这个程序可以运行但是会出现警告。
解释一下,在for中定义的i,其作用范围是for循环内部,而下一行中又一次用到的i是最开始定义的一个作用范围是main函数的局部变量
我们知道,对于全局变量与局部变量:
全局变量的作用范围是全部代码
局部变量的作用范围是它所在的函数
局部变量在它的范围内优先级高于全局变量,即调用变量值时,优先使用局部变量的值
所以,在这篇代码中,当i重复申请是,在for循环内局部的 i 参与运算,在for循环外,参与运算的是另一个 i ,其值为一个随机值,几乎不可能等于n,所以程序无法输出
综上,重名变量在调用时也遵从局部变量与全局变量的关系
上方程序可以修改为
#include<stdio.h>
int main(void){
int a,b,c,i;
scanf("%d %d",&a,&b);
for(c=a;c<=b;++c){
for(i=2;i<=c-1;++i){
if(c%i==0)
break;
}
if(c==i)printf("%d\n",c);
}
return 0;
}
//感谢cmy同学,sjm老师的帮助

浙公网安备 33010602011771号