函数返回临时变量的问题和左值和右值

函数返回之后,临时变量不能再被访问,只是没有指针指向该内存单元(因为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的值存放在内存单元中,可以取地址,所以是一个左值。



  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值