首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++关于局部变量作用域的有关问题

2012-02-07 
c++关于局部变量作用域的问题看以下代码#include iostream.hvoid func(){//定义一个函数func()int acou

c++关于局部变量作用域的问题
看以下代码

#include <iostream.h>
void func(){ //定义一个函数func()
int a;
cout<<a<<endl;
a=50;}
int main(int argc, char* argv[])
{
 func();
 func(); //两次调用
 getchar();
  return 0;
}
输出结果为100499744 50,第一个数为不确定数,这个我知道,因为第一次a没有赋值,可是第二个数却是50,为什么??a不是局部的变量吗??它的作用范围应该出不了两个花括号才对啊,再看下下面这段代码,

#include <iostream.h>
int main(int argc, char* argv[])
{

{int a;
cout<<a<<endl;
a=50;}

{int a;
cout<<a<<endl;
a=50;}  
 getchar();
  return 0;
}

这段代码输出的值是两个都不确定,我感觉这样写,应该表达了局部变量出不了花括号才对,可是第一段代码为什么a的值可以被第二个func()函数获取??
帮忙解答啊。。。谢谢大家了



[解决办法]
第一个程序里面两次进入的刚好用到同一段内存吧

也就是你第一次调用把a所在的内存赋值为50
可能是由于连续调用中间没有其他指令
下一次调用时的a仍然是在同一个地址 他的值就是上一次的50咯
[解决办法]
只能说是巧合把,

恰巧两次调用在同一地址。

cpu有这个功能的,就是为了增加命中率,会把一些数据暂时缓存起来以便以后再次使用。

可能使这个原因。
[解决办法]
因该是编译器搞的鬼,标准是调用一个函数就要进行执行一次压栈出栈,你用的编译器对代码可能进行了优化,它调用同一块代码的时候,对数据只进行一次压栈出栈.可以换一种编译器试试.
[解决办法]
这和函数的调用过程有一定的关系
lz如果学过汇编的话就会明白的。
函数的调用一定程度上是进栈入栈的过程,前一程序是没有被编译器优化过,所以第二次调用时a为50。
第二个程序不同,临时变量空间的申请机制和前者是不一样的

热点排行