函数返回之后,临时变量不能再被访问,只是没有指针指向该内存单元(因为rbp改变了),但是函数返回之前,会将该单元的值赋给寄存器,所以函数返回仍然可以得到了正确的值。
c++程序代码:
#include<iostream>
int add(const int,const int);
int main ()
{
int a=5,b=7;
int z;
z=add(a,b);
std::cout<<z<<std::endl;
return 0;
}
int add (const int x,const int y)
{
int sum;
sum=x+y;
return sum;
}
add函数的汇编代码:
0x0000000000401586 <+0>: push %rbp
0x0000000000401587 <+1>: mov %rsp,%rbp
0x000000000040158a <+4>: sub $0x10,%rsp
0x000000000040158e <+8>: mov %ecx,0x10(%rbp)
0x0000000000401591 <+11>: mov %edx,0x18(%rbp)
0x0000000000401594 <+14>: mov 0x10(%rbp),%edx
0x0000000000401597 <+17>: mov 0x18(%rbp),%eax
0x000000000040159a <+20>: add %edx,%eax
0x000000000040159c <+22>: mov %eax,-0x4(%rbp)
0x000000000040159f <+25>: mov -0x4(%rbp),%eax
0x00000000004015a2 <+28>: add $0x10,%rsp
0x00000000004015a6 <+32>: pop %rbp
0x00000000004015a7 <+33>: retq
从汇编add函数的结果,可以知道sum的值被赋给了eax,在主函数的汇编代码中,eax赋值给了z的内存单元,但是sum这个内存单元已经没有指针指向它了。
然后就是左值和右值的问题,经典的就是a++和++a。a++是一个右值而++a是一个左值。
a++等价于
{
int temp;
a=a+1;
rerurn temp;
}
因为a++返回了一个临时变量,所以它的值保存在寄存器中,所以不能取地址,所以是一个右值。
++a等价于
{
a=a+1;
return a;
}
a的值存放在内存单元中,可以取地址,所以是一个左值。