密苏里科技大学 知乎:关于函数作用域的问提

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/30 01:48:02
main()
{
int x=10;
{
int x=20;
cout<<x<<",";
}
cout<<x
}
答案是 20 10
{
int x=20;
cout<<x<<",";
}
执行完x 不就撤消了吗

还有在这个函数中
void main()
{
intx=10;
func(x)
cout<<x;
}
void func(int x)
{x=20;}
答案是10 为什么不是20?

main()
{
int x=10;
{
int x=20;
cout<<x<<","; //这个x是{}中的x,是20.
} //这个时候,撤销的是{}中的x,而main中的x=10是没有被撤销的.
cout<<x //这个x是main的x,当然是10.
} //这个时候main的x随着程序结束也撤销了.

还有在这个函数中
void main()
{
intx=10;
func(x) //函数结束后,函数中的形参x的空间释放了.
cout<<x; //这个x是main运行的时候开辟的空间,仍然是10
}
void func(int x) //这个时候开辟一个独立的空间,把外面的值放再里面,这里的x,并非传进来的x了.
{x=20;} //这里赋值20是放在运行函数开辟的空间里面,函数运行完毕就释放了.

函数变量的作用域只在该函数范围内有效(指针除外);
当函数func开始被调用时,在栈分配该变量,以后在函数func内的操作都在该变量内,
当func结束后,会自动释放在该栈上分配的变量.

函数分配变量相当于另外创建了一个存储单元给变量x,而主程序变量x的存储单元可以看作是与被调用函数func不同的变量(虽然同名).

如果该函数参数是通过指针传递的话,那就会影响主程序的变量。

调用func是采用的传值方式,而没有传地址,修改的x作用域是func内,如果要通过这样的方式修改x的值要这样声明:
void func(int& x),声明传引用。