变量的作用域



转载自:http://blog.sina.com.cn/s/blog_70ec9a6f010146g6.html

变量的作用域是指其在程序中可以被访问的一个或多个区域。只要分属不同的作用域,可以给变量取相同的名字。作用域有三种:代码块作用域、原型作用域、文件作用域及函数作用域。

1、代码块作用域

根据代码块的定义,任何一对花括号都可构成一个代码块,代码块里用花括号括起来的复合语句当然也算一个代码块。要注意的是:

1) 代码块发生嵌套时,里层代码块的变量如果与外面的变量同名,将临时覆盖外面的变量,当这个代码块执行结束后,会恢复原先变量的值;

2) 两个独立的代码块可以用同名变量,互不影响。

3) 函数形参也具有代码块的作用,只在函数体内起作用。注意,如果在函数内重新定义了一个与形参同名的变量,则将覆盖形参。

例如:

int main(void)

{

       int i=5;

       printf("###i=%d\r\n",i); 

       for(i=0;i<3;i++) 

              printf("***i=%d\r\n",i);

       printf("###i=%d\r\n",i);

   

       system("PAUSE");

       return 0;

}

输出结果:

###i=5

***i=0

***i=1

***i=2

###i=3

若将for(i=0;i<3;i++)改成for(int i=0;i<3;i++),则输出结果为

###i=5

***i=0

***i=1

***i=2

###i=5

程序说明

使用for(i=0;i<3;i++)时,这个i是原有的i,所有for循环直接修改的也是原有的ifor结束时,i已变为3,所以最后输出地是###i=3

使用for(int i=0;i<3;i++)时,此时的i是一个新定义的变量,与原先的变量i同名,因此将临时覆盖原先的ifor循环中修改的也是这个临时的i。等到for循环结束后,i恢复为原来的变量,所以最后的输出是###i=5


 

再看一段程序:

int i=30;

    for(;i++<33;)

    {

              int i=100;

              i++;

              printf("### i=%d\r\n",i);

       }

       printf("@@@ i=%d\r\n",i);

输出结果:

### i=101

### i=101

### i=101

@@@ i=34

程序说明:

1for后面括号里的i是原先定义的i,而花括号里的i是新定义的i,它的作用域为花括号,且每次花括号里面的语句执行完后,这个i都将消失,因此,再次进入for语句,进行i++<33检验时,是原先的i

2i++<33是先将i33比较,不管结果如何,都会将i进行++操作。如果程序如下

int i=30;

    for(;i++<33;)

    {

              printf("### i=%d\r\n",i);

       }

       printf("@@@ i=%d\r\n",i);

输出结果为

### i=31

### i=32

### i=33

@@@ i=34

第一次比较时,i=30,成立,i++,变为31,打印### i=31

第一次比较时,i=31,成立,i++,变为32,打印### 32

第一次比较时,i=32,成立,i++,变为33,打印### 33

第一次比较时,i=33,失败,i++,变为34,循环结束,执行循环后的打印语句,@@@ i=34



2、文件作用域

在所有代码块之外定义的标识符,都具有文件作用域。从它们声明之处开始到源文件结束。

#include <stdio.h>

#include <E:\学习\C和指针\test.h>

int j=6;

int main(void)

{

       printf("###i=%d,j=%d\r\n",i,j);

       int i=5;

       int j=7;

       printf("***i=%d,j=%d\r\n",i,j);     

   

       system("PAUSE");

       return 0;

}

其中,test.h内容为

int i=10;

 

输出结果是

###i=10,j=6

***i=5,j=7

程序说明:

1) j具有文件作用域,但是后面又重新定义了j,因此,被覆盖

2) 头文件中定义的变量(i=10),如果被用#include包含进来,就好像是将头文件之间写在当前文件中一样。当然,它包含进来之后,和j一样,也是可以被覆盖的。

 

3、原型作用域

其实就是注意原型里不能有同名变量即可。

4、函数作用域

主要是针对goto语句,一个函数中的goto语句标签必须唯一。

 

代码块:用花括号括起来的部分就成为代码块。


note:

作用域:程序(全局变量)->文件(全局变量)->函数(局部变量)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值