一个变量名重复的问题--全局变量与局部变量的关系

今天被问到一段程序

//输出区间[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老师的帮助

posted @ 2019-10-20 22:15  云千  阅读(1142)  评论(0)    收藏  举报