一个关于静态局部变量和全局变量初时化的问题!

bsnhk 2005-08-14 01:26:30
下面这个问题真是打了我一巴掌,一直以来以为理所当然的事情竟然是错误的:
int a=100;
int b=a; /*出现编译错误,提示非法的初始化.*/
int *c=&a; /*正确*/
main()
{
int d=100;
static int e=100; /*正确*/
static int f=d; /*出现编译错误,提示非法的初始化.*/
int g=d; /*正确*/
static int h=a;/*出现编译错误,提示非法的初始化.*/
}
结论:静态局部变量和全局变量在初始化时,不能将一个变量名赋值给它.

请问各位高手这是什么机理?
...全文
660 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
qfeng_zhao 2005-08-15
  • 打赏
  • 举报
回复
在c中
对于这种静态局部变量和全局变量在初始化时,要有常量

而在c++中
可以用任何表达式
-----------------------------------------------------
严重同意
刚才在vc下调试一下,后缀为.cpp时,编译通过
改为.c时,编译有三处错误,同楼主一样
slayer.hover 2005-08-15
  • 打赏
  • 举报
回复
晕,,,用BCC32试了一下,,代码是正确的。
nehnre 2005-08-15
  • 打赏
  • 举报
回复
Turbo c2.0和tc++、vc6.0下调试是不一样的,只能这样说,Turbo c2.0更符合c语言规范,所以大家会得到不同的结果。而在严格来讲的c语言下,上面的代码是会报错的。在后面两个编辑器里面是不会报错的。
bsnhk 2005-08-15
  • 打赏
  • 举报
回复
看来似乎在对全局变量和静态局部变量进行处始化时使用常量,程序才是可移植的了.
bugebear3 2005-08-15
  • 打赏
  • 举报
回复
不过,申明全局变量和静态变量还是少用为好。呵呵
foochow 2005-08-15
  • 打赏
  • 举报
回复
静态变量,全局变量的初始化顺序是无法控制的,不同的编译器,连接器,结果都可能不同,不能依赖于声明的顺序...
bsnhk 2005-08-15
  • 打赏
  • 举报
回复
本人有老潭的C、《C和指针》、《C专家编程》、《C语言科学与艺术》、《C语言大全》、《C陷阱与缺陷》……,我好象还没在哪本书中看到不许将变量名赋值给全局变量或静态局部变量的警告。这个问题可能是与编译器有关。我用的是Turbo C2.0
Agener 2005-08-14
  • 打赏
  • 举报
回复
为什么大家的结果都不一样呢?关注!
lxk_cool 2005-08-14
  • 打赏
  • 举报
回复
楼上,我也是用VC 6调试,却没出什么问题,OK
ruiding 2005-08-14
  • 打赏
  • 举报
回复
我试了一下

结果在VC 6 下编译器报错了 :error C2099: initializer is not a constant

抱了三个 都是静态变量和全局变量赋值的地方........
xzgyb 2005-08-14
  • 打赏
  • 举报
回复
在c中
对于这种静态局部变量和全局变量在初始化时,要有常量

而在c++中
可以用任何表达式
yhbttfile 2005-08-14
  • 打赏
  • 举报
回复
你这段代码实际上是没有错误的。

呵呵,哪里的参考书说明了:“静态局部变量和全局变量在初始化时,要求右值是常量,不能是变量。”?

静态局部变量,如:在函数内部的静态变量,初始化发生在该函数在第一次调试时刻。却没有规定被初始化的变量是什么,又不是什么。
如:
void fun()
{
int i;
static int ii = i;
}
这样的局部静态变量,这样的初始化是正确的。

全局变量,由于是在main函数前定义的,所以要求初始化时等式右边(或者括号内的值)必须是在编译时刻是可以计算出来的。所以,也没有明确的说一定是常数,或者其他什么限制。

如:
int i;
static int x = i;

i是全局对象,初始化时i被设置为0。在定义x的时候,i的值已经确定,所以使用i初始化x是可以的。
hansongqi 2005-08-14
  • 打赏
  • 举报
回复
我在VC6下编译也没错
fujingn188 2005-08-14
  • 打赏
  • 举报
回复
VC6下没有报错呀?
caocheng8230 2005-08-14
  • 打赏
  • 举报
回复
同意虫子
foochow 2005-08-14
  • 打赏
  • 举报
回复
同意虫子
doway 2005-08-14
  • 打赏
  • 举报
回复
mark
aniwn 2005-08-14
  • 打赏
  • 举报
回复
规定是必须用常量来初始化全局变量
但是不同的编译器有不同实现
.net下测试通过编译
jixingzhong 2005-08-14
  • 打赏
  • 举报
回复
静态局部变量和全局变量在初始化时,要求右值是常量,不能是变量。
zhouhuahai 2005-08-14
  • 打赏
  • 举报
回复
回复人: xzgyb(老达摩) ( ) 信誉:110 2005-08-14 11:04:00 得分: 0

在c中
对于这种静态局部变量和全局变量在初始化时,要有常量

而在c++中
可以用任何表达式

支持老达摩意见,楼主可以试一下在VC中以.c和.cpp两种形式进行编译,结果恰如老达摩所说!

69,380

社区成员

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

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