/*
* 理解左值和右值
*
*
* 为什么要关心这个?
* 1. 有助于理解C++结构,搞明白编译器的错误和警告
* 2. C++ 11中引入了右值引用,理解左值右值是前提
*
*/ /*
* 简单的定义:
*
* 左值 - 在内存中具有可标识位置的对象
* 右值 - 任何不是左值的对象
*/ //左值的例子:
int i; // i是左值
int* p = &i; // i的地址是可标识的
i = 2; // 内存的内容改变 class dog;
dog d1; // 用户定义类型的左值
// C++代码中大多数变量是左值 //右值的例子:
int x = 2; // 2是右值
int x = i+2; // (i+2)是右值
int* p = &(i+2); // Error,地址不可标识
i+2 = 4; // Error 地址不可标识
2 = i; // Error dog d1;
d1 = dog(); // dog()是用户定义类型的右值 int sum(int x, int y) { return x+y; }
int i = sum(3, 4); // sum(3, 4) 是右值 //右值: 2, i+2, dog(), sum(3,4), x+y
//左值: x, i, d1, p //引用 (或者说左值引用):
int i;
int& r = i; int& r = 5; // Error,引用不能赋值为左值,需要可标识的地址 //例外:常量左值引用可以赋值为右值
const int& r = 5; // // 函数中的例子
int square(int& x) { return x*x; }
square(i); // OK
square(40); // Error //解决方法:
int square(const int& x) { return x*x; } // square(40) and square(i) work /*
* 左值可以用来生成右值
*/
int i = 1;
int x = i + 2; int x = i; /*
* 右值可以用来生成左值
*/
int v[3];
*(v+2) = 4; /*
* 误解1:函数或运算符总是产生右值
*/
int x = i + 3;
int y = sum(3,4); int myglobal ;
int& foo() {
return myglobal;
}
foo() = 50; // 更常见的例子:
array[3] = 50; // 操作符[] 几乎总是返回左值 /*
* 误解2:左值都是可以修改的
*
*/
const int c = 1; // c是左值
c = 2; // Error, 但是c不能被修改 /*
* 误解3:右值不能被修改
*/
i + 3 = 6; // Error,内置类型的确不行
sum(3,4) = 7; // Error // 对于用户定义类型不成立
class dog;
dog().bark(); // dog()是右值,bark() 可能修改dog对象的状态 /*
* 总结
*
* 1. 每个C++表达式生成一个左值或右值
* 2. 如果表达式有一个可以标识的内存地址,则它是左值;否则,是右值
*/

C++进阶--理解左值和右值的更多相关文章

  1. c++中的左值和右值的理解

    1.左值和右值的概念 C++中左值(lvalue)和右值(rvalue)是比较基础的概念,虽然平常几乎用不到,但C++11之后变得十分重要,它是理解 move/forward 等新语义的基础. 左值与 ...

  2. c++ 左值 和 右值

    什么是lvalue, 什么是rvalue? lvalue: 具有存储性质的对象,即lvalue对象,是指要实际占用内存空间.有内存地址的那些实体对象,例如:变量(variables).函数.函数指针等 ...

  3. C++中的左值与右值(二)

    以前以为自己把左值和右值已经弄清楚了,果然发现自己还是太年轻了,下面的这些东西是自己通过在网上拾人牙慧,加上自己的理解写的. 1. 2. 怎么区分左值和右值:知乎大神@顾露的回答. 3. 我们不能直接 ...

  4. C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward

    这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运行测试过的,希望能用这些帮助理 ...

  5. C++11 左值、右值、右值引用详解

    C++11 左值.右值.右值引用详解 左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值. 在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没 ...

  6. C++11 左值、右值、右值引用

    左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值.在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没有名字的就是右值(将亡值或纯右值).举个 ...

  7. C++ 左值与右值 右值引用 引用折叠 => 完美转发

    左值与右值 什么是左值?什么是右值? 在C++里没有明确定义.看了几个版本,有名字的是左值,没名字的是右值.能被&取地址的是左值,不能被&取地址的是右值.而且左值与右值可以发生转换. ...

  8. c++中的左值与右值

    左值(lvalue)和右值(rvalue)是 c/c++ 中一个比较晦涩基础的概念,不少写了很久c/c++的人甚至没有听过这个名字,但这个概念到了 c++11 后却变得十分重要,它们是理解 move/ ...

  9. 关于i++和i++的左值、右值问题

    1.什么是左值和右值? 左值就是出现在表达式左边的值(等号左边),可以被改变,他是存储数据值的那块内存的地址,也称为变量的地址: 右值是指存储在某内存地址中的数据,也称为变量的数据. 左值可以作为右值 ...

随机推荐

  1. NOI-1.3-11-计算浮点数相除的余数

    11:计算浮点数相除的余数 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 计算两个双精度浮点数a和b的相除的余数,a和b都是正数的.这里余数(r)的定义是: ...

  2. L2-008 最长对称子串 (25 分)

    对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一 ...

  3. stm32l071cbt6片内flash操作

    今天在看片内flash的操作,发现按照下面的操作并没有写成功: unsigned long temp = 0x12345678; HAL_FLASH_Unlock(); FLASH_PageErase ...

  4. hdu2461 Rectangles 线段树--扫描线

    You are developing a software for painting rectangles on the screen. The software supports drawing s ...

  5. mysql的utf8与utf8mb4 异同;utf8mb4_unicode_ci 与 utf8mb4_general_ci 如何选择

    如图,一般使用如下配置 utf8mb4是4个字节.utf8是3个字节.utf8mb4兼容性更好,占用空间更大. 主要从排序准确性和性能两方面看: 准确性utf8mb4_unicode_ci 是基于标准 ...

  6. HTTP长连接、短连接究竟

    HTTP长连接.短连接究竟是什么?   1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用I ...

  7. WebSocket-Over-HTTP Protocol

    转自:https://pushpin.org/docs/protocols/websocket-over-http/ WebSocket-Over-HTTP Protocol The WebSocke ...

  8. DOM Access and Manipulation JS 操纵DOM

    JS 操纵DOM 有两种很简单的方式: 如果知道ID 的情况下. 我们可以使用 document.getElementById 我们还可以使用 document.getElementById(&quo ...

  9. Spring+SpringMVC+mybatis框架整合

    1.jdbc.properties 1 driverClassName=com.mysql.jdbc.Driver 2 url=jdbc\:mysql\://127.0.0.1\:3306/slsal ...

  10. MySQL之 从复制延迟问题排查

    一.从库复制延迟问题 1.可能的原因如下(1)主从服务器处于不同的网络之中,由于网络延迟导致:(2)主从服务器的硬件配置不同,从服务器的硬件配置(包括内存,CPU,网卡等)远低于主服务器:(3)主库上 ...