(C++)关于i++和i++的左值、右值问题

1、什么是左值和右值?

左值就是出现在表达式左边的值(等号左边),可以被改变,他是存储数据值的那块内存的地址,也称为变量的地址;

右值是指存储在某内存地址中的数据,也称为变量的数据。

左值可以作为右值,但右值不可以是左值。

因此也只有左值才能被取地址。

2、举两个问题:

int i = 0;

(i++)+=i; //错误

(++i)+=i; //正确

int *ip = &(i++); //错误

int *ip = &(++i); //正确

3、为什么i++不能作左值?

我们来看i++和i++的实现就明白了。

// 前缀形式:
int& int::operator++() //这里返回的是一个引用形式,就是说函数返回值也可以作为一个左值使用
{//函数本身无参,意味着是在自身空间内增加1的
  *this += 1;  // 增加
  return *this;  // 取回值
}
//后缀形式:
const int int::operator++(int) //函数返回值是一个非左值型的,与前缀形式的差别所在。
{//函数带参,说明有另外的空间开辟
  int oldValue = *this;  // 取回值
  ++(*this);  // 增加
  return oldValue;  // 返回被取回的值
}

简单得到理解,就是i++返回的是一个临时变量,函数返回后不能被寻址得到,它只是一个数据值,而非地址,因此不能作为左值。

更简单的代码解释:

// i++:
{
int tmp;
tmp=i;
i=i+1;
return tmp;
}

// ++i:
{
i=i+1;
return i;
}

参考文章:

http://blog.csdn.net/zlhy_/article/details/8349300

  

时间: 2024-10-11 01:27:56

(C++)关于i++和i++的左值、右值问题的相关文章

C++11之右值引用:从左值右值到右值引用

C++98中规定了左值和右值的概念,但是一般程序员不需要理解的过于深入,因为对于C++98,左值和右值的划分一般用处不大,但是到了C++11,它的重要性开始显现出来. C++98标准明确规定: 左值是可以取得内存地址的变量. 非左值即为右值. 从这里可以看出,可以执行&取地址的就是左值,其他的就是右值. 这里需要明确一点,能否被赋值不是区分C++左值和右值的区别. 我们给出四个表达式: string one("one"); const string two("two&

表达式左值右值

左值右值是表达式的属性,该属性称为 value category.按该属性分类,每一个表达式属于下列之一: lvalue left value,传统意义上的左值 xvalue expiring value, x值,指通过“右值引用”产生的对象 prvalue pure rvalue,纯右值,传统意义上的右值(?) 而 xvalue 和其他两个类型分别复合,构成: lvalue + xvalue = glvalue general lvalue,泛左值 xvalue + prvalue = rva

C、C++差异之左值右值

C与C++在语法细节上还是有一些差异的,虽然一般情况下可能这些差异不足以造成结果的区别,但有些代码确实会有影响. 这次,主要总结下左值右值的差异. 在C中,很多左值运算符的结果都不再是左值,然而在C++中,只要逻辑上可行,左值运算符的结果仍然是左值.C++的这种方式,让运算符表达式之间的灵活性更大. 1.++i, 我们都习惯了在C++中,i 自加后返回自己:然而在C中i自加后,返回的是个临时的副本,即和i++是一样的,此结果不能作为左值,即(++i)=0非法.所以我想这就是为什么代码 中还是很多

C++ 左值 右值

最近在研究C++ 左值 右值,搬运.收集了一些别人的资料,供自己记录和学习,若以后看到了更好的解释,会继续补充.(打“?”是我自己不明白的地方 ) 参考:<Boost程序库探秘——深度解析C++准标准库(第2版)> 9787302342731 左值:一个可以用来存储数据的变量,有实际的内存地址(变量名): 右值(非左值):“匿名”的“临时”变量,在表达式结束时生命周期终止,不能存放数据,可被修改,也可不被修改(const修饰). 鉴别左值右值: 左值可用取地址操作符&获取地址,右值不行

【足迹C++primer】59、模板左值右值的转换

模板左值右值的转换 /** * 功能:模板左值右值的转换 * 时间:2014年7月27日08:18:06 * 作者:cutter_point */ #include<iostream> #include<algorithm> #include<utility> using namespace std; template<typename It> auto fcn(It beg, It end) -> typename remove_reference&

C++中的左值右值

对于 C++ 中的左值和右值,我们通常的说法是:当一个对象被用作右值的时候,用的是对象的值(内容):当对象被用作左值的时候,用的是对象的身份(在内存中的位置),这句话来自于 <C++ Primer 第五版> 第 121 页,那么,对于这句话,该作何理解呢?下面我想来谈谈我的看法: ISO C++03规定表达式必须是左值或右值之一,而在ISO C++11中,左值性被正式地扩充为更复杂的值类别,对于一个变量来说,与它相关的有两个部分:一是变量在内存中的地址,二是这个变量在内存中的地址中所存储的数据

左值右值(转)

原文链接:http://blog.csdn.net/csdnji/article/details/169200 左值(lvalue)和右值(rvalue)是编程中两个非常基本的概念,但是也非常容易让人误解,看了很多文章,自我感觉真正将这个问题讲的很透彻的文章还没有看见,所以自告奋勇来尝试一下.如果左值右值的概念不是非常清楚的话,它们迟早会像拦路虎一样跳出来,让你烦心不已,就像玩电脑游戏的时候每隔一段时间总有那么几个地雷考验你的耐性,如果一次把所有地雷扫尽就好了.:) 左值(lvalue)和右值(

左值右值

左值就是可以放在赋值号左边赋值的,必须要在内存有实体 右值就是可以放在赋值号右边取出值赋给其他变量的值,可以在内存,也可以在CPU 引用说明为对象建立引用名,即别名 引用在定义初始化时与对象名绑定,程序中不能对引用重定义 一个对象的别名,从使用方式和效果上,与使用对象名一致 定义形式:类型&引用名=对象名; //引用可以改变指针的指向 //引用可以改变指针指向的值 1 #include <iostream> 2 using namespace std; 3 4 void main()

[C/C++不常见语法特性]_[初级]_[左值-右值-lvalue-rvalue]

参考:1. http://en.cppreference.com/w/cpp/language/value_category   << Value categories >> 2. https://msdn.microsoft.com/en-us/library/dd293668.aspx   << Rvalue Reference Declarator: && >>3. https://msdn.microsoft.com/en-us/li

C++学习之路: 左值&amp;右值 的讨论

本章我们讨论一下左值和右值, 剔除我们在学习C语言时养成一些错误常识. 先上代码 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 6 //在c++98中,变量分为左值和右值,左值指的是可以取地址的变量,右值指的是非左值.二者的根本区别在于能否获取内存地址,能否赋值不是区分的依据. 7 8 //根据这个原则 我们尝试给以下2个变量和2个表达式 取地址 9 string one("one