`

r-value(Rvalue) 和l-value(Lvalue)

 
阅读更多

        在写引用类型与指针的比较这篇随笔的时候,我写了一些试验性的代码以检验一些结论是否正确。
        首先,引用是一个const的指针(注意不是指向const object的指针),所以在声明一个引用的同时必须对这个引用进行初始化。因此

int &b;

编译不能通过是自然而然的事情,错误信息是:references must be initialized。多事的我就想,既然是const的指针,那我能不能这么写呢:

int * const b; 

结果错误信息变成了const object must be initialized if not extern。接着我再给这个statement加了个extern。OK,编译错误没有再出现了,接着,我给这个指针进行赋值。结果出现了这样的编译错误:
        l-value specifies const object。

        到此为止,我看到了一个似懂非懂的东西l-value。 到底什么是l-value呢?我第一时间想到左结合了,譬如说"hello" + "world" + "!" 等价于("hello" + "world") + "!"。由此推广,我可以想到的左值的一个解释就是:在赋值的时候,"="运算符左边的就是左值了。
        而事实上,我的猜测也是基本正确的。左值必须引用于某个对象,而对于赋值运算符,它的左操作数必须是一个左值(lvalue expression must refer to an object.For the assignment to be valid, the left operand must refer to an object-it must be an lvalue. [1] );而右值(rvalue)则是具体的数字型或是字符型的值(Every expression is either an lvalue or an rvalue." So an rvalue is any expression that is not an lvalue. [1])。
      
        以下是对于左值和右值在使用上的几个要点:
        1、右值是不能转化为左值的,而反过来,则是可以的。如:    

int a, b;
= b;

              a和b都是左值,但是b出现在了赋值运算符的右边。编译器在编译过程中做了左值到右值的转换。    
        2、"+"运算符的操作数没有左值或是右值的限制,但是运算的结果却是右值。比如说:

(m + 1= n;

              是会发生编译错误的,因为m + 1是右值;
        3、"&"运算符的操作数必须是左值,而结果也是右值(注意这是取址运算符哦,别跟引用搞混了);
        4、"*"运算符的操作数则左值或着右值,其结果则是左值,如

int a = 2;
int *= new int[3];
*= a;
*(p+1= 3;

       [1] Lvalues and Rvalues
分享到:
评论

相关推荐

    理解C++ lvalue与rvalue

    在C++编程语言中,左值(lvalue)和右值(rvalue)是理解变量、表达式以及内存管理的关键概念。它们对于正确地使用引用、指针以及优化代码至关重要。左值通常指的是可以出现在赋值操作符左边的表达式,意味着它表示...

    c++11 Value Terminology

    C++11标准引入了一套新的术语来描述表达式及其值的类别,这些术语包括左值(lvalue)、右值(rvalue)、悬垂值(xvalue)、一般左值(glvalue)以及纯右值(prvalue)等。这一术语体系的引入旨在更好地解决C++语言中的一些复杂...

    Lua 基础教程(四)变量.pdf

    在Lua中,可以在同一行中同时处理多个lvalue和rvalue: ```lua g, l = 20, 30 ``` 这行代码中,`20`被赋值给`g`,`30`被赋值给`l`。 通过上述内容的学习,我们不仅掌握了Lua中变量的基本概念和用法,还深入了解了...

    C++11中value category(值类别)及move semantics(移动语义)的介绍

    C++11之前value categories只有两类,lvalue和rvalue,在C++11之后出现了新的value categories,即prvalue, glvalue, xvalue。不理解value categories可能会让我们遇到一些坑时不知怎么去修改,所以理解value ...

    calculator

    - `lvalue` 和 `rvalue`:分别表示左值和右值,用于某些特定运算。 - **成员函数**: - `calc()`:执行具体的运算操作。例如,如果 `type` 为阶乘,则调用 `factorial()` 函数;如果是三角函数,则进行相应的转换...

    C++11引用临时变量的解析

    现在,让我们深入了解一下C++中的左值(lvalue)、右值(rvalue)和它们的衍生概念:xvalue和prvalue。 左值(lvalue)是指可以出现在赋值操作符左边的表达式,通常代表一个具有持久性的实体,比如变量。例如,`*E`...

    C PROGRAMMING TUTORIAL

    - **Rvalue:** An expression representing a value that can appear on the right-hand side of an assignment. #### C Constants and Literals Constants are values that cannot be changed during program ...

    Decltype and auto (revision 3) Programming Language 英文

    - decltype用于获取表达式类型的值类别(lvalue、rvalue或xvalue),它解决了模板元编程中获取类型信息的难题。 - 但decltype也存在一些问题,例如它不能处理未初始化的变量,以及在某些复杂情况下可能会导致意外...

    嵌入式系统和linux工程师面试题.docx

    - GCC 3.2.2支持的编程语言通常包括C、C++、Objective-C和Ada等。 - 包含`CHAR_BIT`的头文件是`<limits.h>`,它定义了字符类型的位数。 3. **编程概念和技术**: - **匈牙利命名法**的优点是提高了代码可读性,...

    自考c++知识点总结.docx

    - 左值(Lvalue)是可以被赋值和修改的表达式,如变量。 - 右值(Rvalue)是不能被赋值或修改的表达式,通常是常量或临时对象。 4. 指针与常量: - 指向常量的指针:`const int *p`,`*p`不能被修改。 - 常量...

    自学考试c++知识点总结.doc

    在C++编程语言中,掌握核心概念和语法是至关重要的。以下是一些关键知识点的概述: 1. 动态内存管理: - `new`关键字用于动态分配内存,如分配单个对象:`指针名 = new 类型名;` 或者分配对象数组:`指针名 = new ...

    编译原理课程设计报告

    3. **常量和类定义**:定义常量字符,并创建处理数学函数的类`Fun`,包含函数类型(`type`)、操作符号(`op`)、左操作数(`lvalue`)和右操作数(`rvalue`)。`FunNum`用于统计函数数量,`FUN`为静态字符串数组,...

    编译原理课程设计 表达式计算器

    - 定义一个名为`Fun`的类,包含函数类型(`type`),操作符(`op`),左操作数(`lvalue`)和右操作数(`rvalue`)。 - `Fun`类还有静态成员`FUN[]`用于存储函数名,以及一个`calc()`成员函数用于计算函数结果。 ...

    stl数据结构.docx

    **概念**: 关联式容器中的每个元素都包含一个键(key)和一个值(value),并根据键的值进行排序和存储。 **特点**: - 插入元素时,容器会根据键值的大小将元素放置到适当的位置。 - 关联式容器没有明显的头部和尾部,...

    右值引用、移动语义和完美转发1

    在C++编程语言中,右值引用和移动语义是C++11标准引入的重要特性,它们极大地提升了程序性能,特别是在处理临时对象和资源管理时。本文将详细探讨这两个概念,以及它们如何与左值引用和左值、右值相互作用。 首先,...

    计算器控制台应用实现混合运算

    `Fun`类有成员变量如操作符类型(op)、类型(type)、左右值(lvalue 和 rvalue),以及静态数组`FUN`,存储了所有支持的函数名。`calc()`方法负责计算对应函数的值,如计算阶乘、组合数、排列数等。 对于表达式的...

    《深入理解C++11》读书笔记

    `std::is_pod<T>::value`、`std::is_standard_layout<T>::value`和`std::is_trivial<T>::value`可以分别用于判断类型是否为POD、标准布局和平凡类型。 **列表初始化**通过`{}`语法实现,允许更直观地初始化内置类型...

    cpp代码-左值 和 右值 ---- 左值引用(就是别名) 和 右值引用

    在C++编程语言中,左值(lvalue)和右值(rvalue)是两个非常重要的概念,它们定义了表达式在程序中的行为方式。理解这两个术语对于编写高效且无误的C++代码至关重要。左值引用和右值引用则是C++11引入的新特性,...

Global site tag (gtag.js) - Google Analytics