博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
左值和右值
阅读量:5101 次
发布时间:2019-06-13

本文共 1158 字,大约阅读时间需要 3 分钟。

1.

  • lvalue估计来源于left value。 在赋值语句中lvalue = rvalue;位置处于左边。就是可以修改的值。
  • rvalue估计来源于right value。处于赋值语句右边,是只读的不可修改的值。
  • lvalue是可以赋值的,说明它是一个变量,它在内存中一定存在,一定有地址。所以&lvalue是有效的,能取到在内存中的地址。

    访问lvalue一定会导致CPU访问存储器(相对较慢的操作)。

    lvalue的例子:

    1. int a;  
    2. a = 10; // a是lvalue。   
    3. int* p = &a; // &a是rvalue。   
    4. &a = 0; //错误,&a不是lvalue,因为a的地址一旦分配好了,就不能改变了。  
  • rvalue是不可以赋值的,它不是一个变量,在内存中没有存在,没有地址。它要么是存在于CPU的寄存器中,要么是存在于指令中(立即数)。所以只要对rvalue取地址,那么就一定是错误的(编译器会抱怨的)。

    访问rvalue不会导致CPU访问存储器(对立即数和寄存器的访问很快)。

    rvalue的例子:

    1. int a;  
    2. a = 10; // 10是rvalue,它没有地址,&10就是错误的表达式。从汇编语言的角度来看,10是直接存在于MOV指令中的立即数。   
    3. 10 = a; // 错误,10是rvalue,不可赋值。   
    4. //函数返回值属于rvalue,因为返回值通常用CPU寄存器传递,没有地址。   
    5. int foo()  
    6. {  
    7.     return 0;  
    8. }  
    9. int b = foo(); //没问题,函数返回值是rvalue。   
    10. int* p = &foo(); //错误,rvalue没有地址。   
    11. void bar(int& i)  
    12. {  
    13. }  
    14. bar(foo()); //错误,bar函数参数需要的是lvalue。  
  • 函数的返回值是rvalue,对于返回int, char 等这样最基本的类型,是通过CPU寄存器返回的,因此返回值没有地址是可以理解的。但是如果函数返回的是一个用户自定义类型的对象,肯定不可能通过寄存器来返回这个对象值的(寄存器大小数量都有限,对象的大小可以非常大),那究竟是怎样返回对象的呢?

     

    1. class UDT  
    2. {  
    3.   int data[100];  
    4. public:  
    5.   UDT()  
    6.   {  
    7.     printf("construct/n");  
    8.   }  
    9.   BBB& operator = (BBB& )  
    10.   {  
    11.     printf("operator =/n");  
    12.     return *this;  
    13.   }  
    14. };  
    15. UDT foo()  
    16. {  
    17.   return UDT();  
    18. }  
    19. void main()  
    20. {  
    21.   UDT obj = foo();  

转载于:https://www.cnblogs.com/dreamgym/p/5136506.html

你可能感兴趣的文章
小记:xml画一个爱心。
查看>>
MySQL表的四种分区类型
查看>>
7.26
查看>>
dll--二进制层面的复用
查看>>
linux 压缩/解压缩/打包命令
查看>>
守护进程
查看>>
CLR 关于强命名程序集 .
查看>>
[BZOJ 3489] A simple rmq problem 【可持久化树套树】
查看>>
如何制作并更改项目icon文件
查看>>
设计模式:迭代器模式(Iterator)
查看>>
cmd批处理常用符号详解
查看>>
关于给构造函数传达参数方法
查看>>
mysql忘记密码时如何修改root用户密码
查看>>
STM32单片机使用注意事项
查看>>
在linux中出现there are stopped jobs 的解决方法
查看>>
获取浏览器版本信息
查看>>
SQLServer之删除视图
查看>>
js forEach跳出循环
查看>>
MyBatis---动态SQL
查看>>
快速创建一个 spring mvc 示例
查看>>