在mian函数中用全局变量给同一标识符局部变量赋值,为什么结果是未定义值呢?!

aiyiya_cssdn 2012-11-17 01:46:41
#inclue<stdio.h>
int i=1;
int main(int argc,char **argv)
{
int i = i;
printf("i=%d\n",i);
return 0;
}
...全文
294 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Geterns 2012-11-17
  • 打赏
  • 举报
回复
引用 6 楼 yisikaipu 的回复:
引用 5 楼 Geterns 的回复:我试了下g++确实不会,不知道楼主用的什么编译器…… 如果有编译器报告未定义,那是不符合标准的编译器 ISO标准2003 $3.3.1/1 专门就有带例子的表述 The point of declaration for a name is immediately after its complete declarat……
厉害!受教了~
yisikaipu 2012-11-17
  • 打赏
  • 举报
回复
引用 5 楼 Geterns 的回复:
我试了下g++确实不会,不知道楼主用的什么编译器……
如果有编译器报告未定义,那是不符合标准的编译器 ISO标准2003 $3.3.1/1 专门就有带例子的表述 The point of declaration for a name is immediately after its complete declarator (clause 8) and before its initializer (if any), except as noted below. [Example: int x = 12; { int x = x; } Here the second x is initialized with its own (indeterminate) value. ]
Geterns 2012-11-17
  • 打赏
  • 举报
回复
引用 3 楼 yisikaipu 的回复:
引用 1 楼 Geterns 的回复:发现在main函数中已经有局部变量要命名为i了,首先,全局变量i在这个函数作用域内被屏蔽了。 然后,你在声明定义局部变量i的时候想用一个叫做i的变量来给它初始化(这个时候局部变量i还没有完成定义),编译器就会告诉你,i没有定义,这个i是int i=i中的后者。 错!编译器不会报告变量i未定义 int i=i; 后面……
我试了下g++确实不会,不知道楼主用的什么编译器……
davidie 2012-11-17
  • 打赏
  • 举报
回复
同楼上。补充一点,这里涉及到的是变量的作用于与可见性的问题。在C++中,通常标识符的可见性和作用域是一致的。只有在嵌套块的结构中,内层块的标识符覆盖了所有外层块的同名标识符,即在内层块的作用域范围内,外层块的同名标识符不可见,但它们仍然蹲在,从而导致标识符的可见性和作用域不一致。
yisikaipu 2012-11-17
  • 打赏
  • 举报
回复
引用 1 楼 Geterns 的回复:
发现在main函数中已经有局部变量要命名为i了,首先,全局变量i在这个函数作用域内被屏蔽了。 然后,你在声明定义局部变量i的时候想用一个叫做i的变量来给它初始化(这个时候局部变量i还没有完成定义),编译器就会告诉你,i没有定义,这个i是int i=i中的后者。
错!编译器不会报告变量i未定义 int i=i; 后面的i就是前面的i,已定义,但未初始化 而如果这样写 int i=::i; 后面的i是全局变量
Geterns 2012-11-17
  • 打赏
  • 举报
回复
还有,一个C++里面声明全局作用域的运算符::,C里面应该也能用吧。你的代码,把int i = i;改成int i = ::i; 应该就能用了。::i意思是“全局作用域里的i”而不是“main函数作用域里的i”。
Geterns 2012-11-17
  • 打赏
  • 举报
回复
发现在main函数中已经有局部变量要命名为i了,首先,全局变量i在这个函数作用域内被屏蔽了。 然后,你在声明定义局部变量i的时候想用一个叫做i的变量来给它初始化(这个时候局部变量i还没有完成定义),编译器就会告诉你,i没有定义,这个i是int i=i中的后者。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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