一道面试题

yizhe0314 2010-03-24 06:05:56
静态函数只能访问静态变量,不能访问普通变量 OK 还是 XX
请说明理由。
...全文
343 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
bobo364 2010-03-26
  • 打赏
  • 举报
回复
应该这么说,静态变量和函数属于类不属于对象,而普通变量属于对象
shang_shang 2010-03-26
  • 打赏
  • 举报
回复
如果是C语言的话 静态函数可以访问非静态和静态变量 但其作用域仅在本文件中
如果是C++的话 静态函数如果是类成员函数,只能访问类静态成员变量,如果非类成员函数,用法与C相同
zhudongdong007 2010-03-26
  • 打赏
  • 举报
回复
应该是不对的。

C++我不懂,可是对JAVA来说是可以的。

我只要在静态方法里面实例化对象就可以了。

那样就可以调用里面的非静态变量了。

呵,加油,楼主。
ithiker 2010-03-25
  • 打赏
  • 举报
回复
原来楼主问的是在c++下的;还以为是c下的
fengqiang6863 2010-03-25
  • 打赏
  • 举报
回复
静态函数只能访问静态变量是因为编译器在编译时首先初始化的是静态变量,处理静态函数。而此时非静态函数还没有进行处理。所以当然不能用静态函数来访问非静态变量了,但是按照这个原理,非静态函数能访问静态变量的事实也就顺理成章了。
james_hw 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jackyjkchen 的回复:]

对于静态全局函数而言,我至今没发现其用武之地……
[/Quote]

可以设为模块私有,避免被其他模块使用
yizhe0314 2010-03-25
  • 打赏
  • 举报
回复
对于这道题目 怎么回答比较好
我当时回答说 这是错的
然后面试官继续问我理由
我说 静态函数,静态变量,普通变量在谁只能访问谁上 没有必然联系。。。。
vchell 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fengqiang6863 的回复:]
静态函数只能访问静态变量是因为编译器在编译时首先初始化的是静态变量,处理静态函数。而此时非静态函数还没有进行处理。所以当然不能用静态函数来访问非静态变量了,但是按照这个原理,非静态函数能访问静态变量的事实也就顺理成章了。
[/Quote]

曾经看到孙鑫这样介绍过,对的
vchell 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fengqiang6863 的回复:]
静态函数只能访问静态变量是因为编译器在编译时首先初始化的是静态变量,处理静态函数。而此时非静态函数还没有进行处理。所以当然不能用静态函数来访问非静态变量了,但是按照这个原理,非静态函数能访问静态变量的事实也就顺理成章了。
[/Quote]

曾经看到孙鑫这样介绍过,对的
ithiker 2010-03-25
  • 打赏
  • 举报
回复
上面范围写大了,改为:
全局变量和全局静态变量的存储是放在一块的,初始化的全局变量和全局静态变量在一块区域, 未初始化的全局变量和未初始化的全局静态变量在相邻的另一块区域。程序结束后由系统释放。

局部静态变量放哪里我也不知道
ithiker 2010-03-25
  • 打赏
  • 举报
回复
引用11楼的,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。所以这个例子不能证明XX;
做了几个变形:

#include <stdio.h>
int m=10;
static int test()
{
return m;
}
int main()
{
printf("%d",test());//输出10,m为全局变量
}


#include <stdio.h>
staticint m=10;
static int test()
{
return m;
}
int main()
{
printf("%d",test());//输出10,m为全局静态变量
}


#include <stdio.h>
static int test()
{
return m;
}
int main()
{
static int m=10;
printf("%d\n",test());//m为局部静态变量
//error C2065: 'm' : undeclared identifier
}
code]
[code=C/C++]
#include <stdio.h>
static int test()
{
return m;
}
int main()
{
int m=10;
printf("%d\n",test());//m为静态变量
//error C2065: 'm' : undeclared identifier

}

从上可知:静态函数只能访问全局静态变量和全局变量,不能访问局部变量和局部静态变量
iealien 2010-03-25
  • 打赏
  • 举报
回复
静态变量是内部连接的或者空连接的
xianqingzh 2010-03-25
  • 打赏
  • 举报
回复
还有一个疑问:为什么全局变量可以在多个文件中引用
而静态变量不行呢?本质是?
benbshmily 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jackyjkchen 的回复:]

对于静态全局函数而言,我至今没发现其用武之地……
[/Quote]
那可能是你经历得太少。
猫头鹰之眼 2010-03-25
  • 打赏
  • 举报
回复
学习中。。。。
howlet2 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jackyjkchen 的回复:]
对于静态全局函数而言,我至今没发现其用武之地……
[/Quote]
可以防止该函数被外部文件引用。防止多个文件定义了相同函数的时候,发生重定义的错误
  • 打赏
  • 举报
回复
楼主有说是类吗?!
bluishocean 2010-03-25
  • 打赏
  • 举报
回复
楼上这个例子没有用到类的概念吧!是不是和楼主讨论的静态函数不能等同?楼上的应该是10楼所说的全局函数把?
求教啊
  • 打赏
  • 举报
回复
意思就是说这样不行?
#include<stdio.h>

m=10;

static int test()
{
return m;
}

int main()
{
printf("%d",test());
}

是这样的吗,如果是的话那可就XX
huanmie_09 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 demon__hunter 的回复:]
静态函数函数不一定是类成员函数吧~~~~
[/Quote]
恩。看成静态成员函数了。
函数调用的结果不会访问或者修改任何对象(非static)数据成员,这样的成员声明为静态成员函数比较好。且如果static int func(....)不是出现在类中,则它不是一个静态成员函数,只是一个普通的全局函数,只不过由于 static 的限制,它只能在文件所在的编译单位内使用,不能在其它编译单位内使用。
普通变量在编译期间还没有处理。
加载更多回复(6)

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧