Goforyouqp  

左值(lvalue)和右值(rvalue)是C语言和C++语言中的概念。它们用于描述表达式中的值的性质。但是,请注意左值和右值在C语言和C++语言中的处理方式有一些差异。

C语言中


- 左值(lvalue)表示一个可以被取地址的表达式,它有一个确定的内存位置。例如,变量、数组和通过取地址运算符`&`获取的值都是左值。
- 右值(rvalue)表示一个不可被取地址的表达式,它没有一个确定的内存位置。例如,字面量和表达式的计算结果(除取地址运算符外)都是右值。

#include <stdio.h>

int main() {
    int a = 10; // a是左值,可以取地址
    int b = 5;  // b是左值
    
    int c = a + b; // a + b的结果是右值
    
    printf("a = %d\n", a); // 输出 a = 10,a是左值
    printf("b = %d\n", b); // 输出 b = 5,b是左值
    printf("c = %d\n", c); // 输出 c = 15,c是左值
    
    int* ptr = &a; // &a是左值,可以取地址
    printf("*ptr = %d\n", *ptr); // 输出 *ptr = 10,*ptr是左值
    
    return 0;
}

C++语言中


- 左值(lvalue)的概念和C语言中的相同,表示一个可以被取地址的表达式。
- 右值(rvalue)的概念扩展了C语言中的右值,它表示一个无法被取地址的表达式。

在上述示例中,变量a和b都是左值,因为它们具有确定的内存位置,我们可以对它们进行地址操作,如取地址运算符`&`。变量c是由a和b计算得到的结果,它是一个右值,因为它只是一个临时的计算结果,并没有一个确定的内存位置。

此外,在示例中,我们还演示了将左值的地址赋给指针变量ptr,并通过解引用运算符`*`来访问指针所指向的值。`*ptr`是一个左值,因为它具有确定的内存位置。

C++语言将右值分为纯右值(prvalue)和将亡值(xvalue)两种:
- 纯右值(prvalue)是指可被复制的临时对象,如字面量、计算表达式的结果等。
- 将亡值(xvalue)表示即将被销毁的对象,如std::move操作后的对象。

C++11引入了右值引用(rvalue reference)的概念,使得对右值的操作更加灵活。

以下是一个示例代码,用于说明纯右值和将亡值的概念:

#include <iostream>
#include <vector>

int getValue() {
    return 42;
}

int main() {
    int a = 10; // a是左值
    
    int b = getValue(); // getValue()是一个纯右值
    
    int&& c = getValue(); // getValue()是一个将亡值,绑定到右值引用c上
    
    std::vector<int> vec;
    vec.push_back(getValue()); // getValue()是一个纯右值,传递给push_back函数的将亡值
    
    return 0;
}

在示例中,函数`getValue()`返回一个整数值,这个返回值就是一个纯右值。变量`b`通过调用`getValue()`并将返回值赋给它,它绑定到一个纯右值。

另外,我们创建了一个右值引用`c`,它绑定到`getValue()`的返回值,这个返回值是一个将亡值。

在`std::vector`的例子中,我们调用`push_back`函数并将`getValue()`的返回值作为参数传递,这个返回值是一个纯右值,随后被传递到了`vector`的内部。

总结:
- 纯右值(prvalue)是表达式的结果,不可被取地址,例如字面值、计算结果等。
- 将亡值(xvalue)是即将被销毁的对象,通过std::move转换得到的对象等。
- 在C++中,通过右值引用(rvalue reference)可以绑定到将亡值。
- 将亡值可以在C++中用于实现移动语义,提高性能。
- 左值(lvalue)和右值(rvalue)的概念在C语言和C++语言中都存在。
- C++语言中对右值进行了更细致的划分,引入了将亡值(xvalue)的概念,并支持右值引用的使用。

posted on 2023-06-28 23:19  嵌入式小白-小黑  阅读(108)  评论(0编辑  收藏  举报  来源