以下是一个返回整数
的简单函数定义int myFunc()
{
int localVar = 99;
return localVar;
}
它在main中调用为
int main()
{
int y = myFunc();
cout << y << endl;
return 0;
}
这可以按预期工作。我想知道为什么?
localVar
是一个局部变量,其值在堆栈中分配。一旦功能结束,它就会超出范围。因此,localVar
会超出调用范围int y = myFunc();
如何/为什么它仍然能够返回正确的值?
答案 0 :(得分:6)
您的函数正在返回值的副本 - 这就是“按值返回”的含义。
int y = myFunc();
会将值的字节从函数调用使用的临时位置复制到本地变量。
如果你返回局部变量的地址,它只会失败。
答案 1 :(得分:2)
这里有三件事需要注意:
localVar
myFunc
y
是的,localVar
超出了myFunc
末尾的范围。但是,在此之前,它的值被复制到myFunc
的返回值(这就是return
语句的作用)。然后,将此返回值复制到对象y
中。 localVar
现在已经消失并不重要 - 你有一份副本。
这正是按价值返回的结果。它将return
语句中表达式的结果复制到返回值中。
答案 2 :(得分:0)
localVar
。如果有可用的寄存器,也可以使用它。
如果它实际上是在堆栈上创建的,那么在返回时无论如何都会将值复制到寄存器中。
答案 3 :(得分:0)
由于您的return
类型的功能:int myFunc()
。它允许您传回int
值。变量localVar确实超出了main()的范围,但是localVar没有在那里使用,y是,当用作y = myFunc()
时,它接受返回的int值。