| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1005 人关注过本帖
标题:有关作用域
只看楼主 加入收藏
davidguhao
Rank: 1
来 自:广东
等 级:新手上路
帖 子:126
专家分:7
注 册:2016-7-18
结帖率:89.47%
收藏
已结贴  问题点数:5 回复次数:6 
有关作用域
外部变量作用域
外部静态变量的作用域
分别是什么……
我看到的书中写得有些前后矛盾……
希望有实践经验的大神能够给我解答
搜索更多相关主题的帖子: 矛盾 
2016-08-09 16:28
davidguhao
Rank: 1
来 自:广东
等 级:新手上路
帖 子:126
专家分:7
注 册:2016-7-18
收藏
得分:0 
或许我应该换一种问法:
在我现在所学内容中:在函数外面声明变量有三种方式:
1 int x;
2 static int x;
3 extern int x;
那么现在这三种形式的作用域究竟是多少呢?

暨南大学市场营销……
但是我有一颗计算机专业的心……
2016-08-09 16:49
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
extern int x和int x不同文件调用用到的。其实加不加extern都能找到。
static int x和int x在主函数没有区别。在子函数区别很大,子函数用完,里面的数据就被释放,这你应该知道。
如果加了static,那么这个数据在子函数调用完之后也,程序也不会将它释放。
至于你问的作用域究竟多少,关键还是要看你代码是如何写的。所以你只要明白你所声明的变量作用域大小就行了。
2016-08-09 17:04
zx315
Rank: 5Rank: 5
来 自:广东
等 级:职业侠客
威 望:2
帖 子:86
专家分:378
注 册:2016-7-13
收藏
得分:0 
回复 楼主 davidguhao
C 语言中变量具有 3 个性质:存储期限、作用域、链接性。

存储期限决定了为变量预留和内存被释放的时间:
具有自动存储期限的变量在所属块被执行时获得内存单元,并在块终止时释放内存单元,从而会导致变量失去值;
具有静态存储期限的变量在程序运行期间占有同一个的存储单元,也就允许变量无限期地保留它的值。

变量的作用域指可以引用变量的那部分程序文本:
块作用域:变量从声明的地方一直到所在块的末尾都是可见的;
文件作用域:变量从声明的地方一直到所在文件的末尾都是可见的。

变量的链接确定了程序的不同部分可以共享此变量的范围:
外部链接:变量可以被程序中的几个文件共享;
内部链接:变量只能属于单个文件,但此文件中的函数可以共享该变量;
无链接:的变量属于单个函数,并且不能被共享。

变量的默认存储期限、作用域和链接都依赖于变量声明的位置:

程序代码:
int i;      //静态存储期限、文件作用域、外部链接

void f(void) {
    int j;  //自动存储期限、块作用域、无链接
}


可以通过指定存储类型来改变变量的性质。

===

对于不同的存储类型的变量,其性质如下:

auto
auto 存储类型只对属于块的变量有效。auto 变量具有自动存储期限、块作用域,并且无链接。对于块内部声明的变量,默认是 auto 存储类型的。

static
static 存储类型可用于全部变量。当用在块外部时,说明变量具有内部链接;当用在块内部时,说明变量具有静态存储期限。
程序代码:
static int i;       // 静态存储期限、文件作用域、内部链接

void f(void) {
    static int j;   // 静态存储期限、块作用域、无链接
}


extern
extern 声明中的变量始终具有静态存储期限,变量的作用域依赖于声明的位置,如果声明在块内部,那么变量具有块作用域;否则,变量具有文件作用域。如果变量在文件中较早的位置(任何函数定义的外部)声明为 static,那么它具有内部链接;否则(通常情况下),变量具有外部链接。

register
register 存储类型只对声明在块内的变量有效。register 变量具有和 auto 变量一样的存储期限、作用域和链接。

[此贴子已经被作者于2016-8-9 21:23编辑过]


Read The Fucking Source Code~
2016-08-09 21:07
davidguhao
Rank: 1
来 自:广东
等 级:新手上路
帖 子:126
专家分:7
注 册:2016-7-18
收藏
得分:0 
回复 3楼 linlulu001
我主要针对的还是声明在函数块外面的,就是在声明头文件后面一点点就开始声明的变量。
static 这个静态在内部我知道它有保证变量不被销毁的功能。
就是我想知道在函数块外面声明的各种外部变量,int x;与 extern int x; 与 static int x; 他们三个在声明之后作用域打到了哪里。
是本文件还是贯穿整个程序。
就这样……

总而言之,能不能帮我做个选择题?

int x; 作用域 :a。本文件 b。整个程序
extern int x; 作用域: a.本文件 b.整个程序
static int x; 作用域: a.本文件 b.整个程序
就这么以上三个选择题,谢谢您😀

暨南大学市场营销……
但是我有一颗计算机专业的心……
2016-08-09 22:16
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:5 
定义外部变量的话
static int x 这个变量的作用域限制在本文件中,不能被其它文件引用。称为静态外部变量。
int x   贯穿整个文件,能够被其它文件引用。
extern int x 将其它文件中已定义的外部变量的作用域扩展到本文件。
file1.c;                            file2.c;                            flie3.c
#include <stdio.h>                  #include <stdio.h>                  #include <stdio.h>   
int x;                              stctic int a;                       extern x;   //把在file1文件中已定义的外部变量的作用域扩展到本文件
int main()                          int main()                          extern a;
{………………}                     {………………}                       int main()
                                                                {a=a*x    //不能将文件file2文件中已定义的外部变量a引用过来,所以出错}
2016-08-09 23:17
davidguhao
Rank: 1
来 自:广东
等 级:新手上路
帖 子:126
专家分:7
注 册:2016-7-18
收藏
得分:0 
回复 6楼 linlulu001
太棒了!谢谢你啊!就是想要这么清楚的解释O(∩_∩)O

暨南大学市场营销……
但是我有一颗计算机专业的心……
2016-08-10 13:20
快速回复:有关作用域
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015961 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved