[C.C++] 【C语言】C和C++中的左值、右值、纯右值、将死值

454 0
Honkers 2025-3-6 20:57:38 | 显示全部楼层 |阅读模式

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

C语言中


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

  1. #include <stdio.h>
  2. int main() {
  3. int a = 10; // a是左值,可以取地址
  4. int b = 5; // b是左值
  5. int c = a + b; // a + b的结果是右值
  6. printf("a = %d\n", a); // 输出 a = 10,a是左值
  7. printf("b = %d\n", b); // 输出 b = 5,b是左值
  8. printf("c = %d\n", c); // 输出 c = 15,c是左值
  9. int* ptr = &a; // &a是左值,可以取地址
  10. printf("*ptr = %d\n", *ptr); // 输出 *ptr = 10,*ptr是左值
  11. return 0;
  12. }
复制代码

C++语言中


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

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

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

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

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

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

  1. #include <iostream>
  2. #include <vector>
  3. int getValue() {
  4.     return 42;
  5. }
  6. int main() {
  7.     int a = 10; // a是左值
  8.     
  9.     int b = getValue(); // getValue()是一个纯右值
  10.     
  11.     int&& c = getValue(); // getValue()是一个将亡值,绑定到右值引用c上
  12.     
  13.     std::vector<int> vec;
  14.     vec.push_back(getValue()); // getValue()是一个纯右值,传递给push_back函数的将亡值
  15.     
  16.     return 0;
  17. }
复制代码

在示例中,函数`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)的概念,并支持右值引用的使用。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

荣誉红客

关注
  • 4008
    主题
  • 36
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行