关于i++和++i以及左值,右值

转载 2015年07月08日 13:05:18

原本一直对i++和++i的区别不是很在意,觉得i++就是先用了i的值(用于赋值之类的操作),再i自加1.

   而++i就是把i的值先自加1再用作其他操作.

         很多人都问类似于j=++i+++i+i;之类的题目,个人觉得除了有些变态的学校的变态的考试会考.其他根本用不到.如果你在实际写代码的时候这样写,不但是给自己找麻烦,以后代码维护时,你也会被人在心里诅咒很久的....

         貌似跑题了,汗.... 反正以前就一直没在意这个.

 

 

       不过今天无意之间看到了帖子上有人说  i++=5;      //不合法

                                                            ++i=5;      //合法

       觉得有点奇怪,所以就由着自己的兴趣找了些资料.说些自己的看法:

 

 

 

       一. 这个问题牵涉到得首先是左值(L-value)和右值(R-value)的概念;

            1. 我查资料的时候发现很多地方都引用一句话:"通俗的讲,左值就是能够出现在赋值符号左面的东西,而右值就是那些可以出现在赋值符号右面的东西了。"我觉得这句话在刚开始理解的时候是什么用都没有的一句废话.因为我们都不知道哪些东西应该放在赋值符号的左边,哪些东西又应该放在赋值符号的右边这样说是没有意义的.

            2.接着我找到个比较靠谱的定义:左值是指具有对应的可由用户访问的存储单元,并且能由用户改变其值的量。如一个变量就是一个左值,因为它对应着一个存储单元,并可由编程者通过变量名访问和改变其值。

               (下面的第三点是c++primer中的)

            3.变量和文字常量都有存储区,并且有相关的类型。区别在于变量是可寻址的(addressable)对于每一个变量都有两个值与其相联:

                 1).它的数据值,存储在某个内存地址中。有时这个值也被称为对象的右值(rvalue,读做are-value).我们也可认为右值的意思是被读取的值(read   value)。   文字常量和变量都可  被用作右值。   

                 2).它的地址值——即存储数据值的那块内存的地址。它有时被称为变量的左值(lvalue,读作ell-value)。我们也可认为左值的意思是位置值location   value文字常量不能被用作左值

 

       到这里,左值和右值的基本概念应该清楚了.而一些牛人追求的更细致的到C89和C99以及C++标准上面的差异就不在我的思考范围了:)

 

 

 

 

      二.再讲讲i++和++i的实现

               原来也一直迷惑于i++与++i的返回值的问题,但一直没弄明白.这次一并查清楚吧.

               首先对于i++的实现是:   

                                             int   temp;   

                                             temp   =   i;   
                                             i   =   i+1;   
                                             return   temp;   
                         而++i的实现是:   
                                              i   =   i+1;   

                                              return   i;               

               所以对于我们提出来的问题已经能得到解决了:

                    i++=5; 是错误的是因为i++返回的是编译器自动分配的临时变量temp,而这个temp并不是你程序中定义的可寻址变量的引用,也就是说你不能通过地址对它进行操作.(换句话说就是不能作为左值)

                    ++i=5;是正确的就是因为其返回值就是i;

 

          再啰嗦几句关于i++和++i的效率问题:按上面分析来说,++i的效率是比i++效率高些的.(VC)对于内置(built-in)类型,写++变量和变量++编译器都经过优化,采用++变量的方式.但是对于自定义类对象如果重载先++,和后++操作符那么要使用先++,因为这时编译器,不可能对你的类型进行优化!  

i++与++i作为左值

#include using namespace std; int main() {  int i = 9;  //i++ = 10;   ++i = 10;  return 0; ...
  • djb100316878
  • djb100316878
  • 2014年11月16日 15:31
  • 1344

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

左值、右值在C++11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。...
  • u010599509
  • u010599509
  • 2016年07月27日 13:27
  • 5718

左值与右值的区别

左值跟右值的区别
  • u010317005
  • u010317005
  • 2016年08月22日 00:29
  • 583

关于i++和++i以及左值,右值

原本一直对i++和++i的区别不是很在意,觉得i++就是先用了i的值(用于赋值之类的操作),再i自加1.    而++i就是把i的值先自加1再用作其他操作.          很多人都问类...
  • ARLoverKang
  • ARLoverKang
  • 2013年10月09日 22:52
  • 351

C++11左值右值、转移语义

首先看一下c++11标准新特性: 右值引用: 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语...
  • fffupeng
  • fffupeng
  • 2016年09月20日 15:17
  • 637

重载中碰到的左值和右值问题

double & Student::operator[ ] (int i) {         return scores[i];  } double Student::operator[ ]...
  • mjcheng8879
  • mjcheng8879
  • 2015年10月20日 09:07
  • 335

C语言中左值与右值

声明:本文转自 http://blog.csdn.net/qikaibinglan/article/details/6203483 如果有侵犯他人版权,请通知我我会马上删除     左值就是在赋...
  • Leichelle
  • Leichelle
  • 2011年11月05日 19:44
  • 8543

指针/地址 到底是左值还是右值

一下引用网友:lm_whales左值可以当作右值使用,右值不能当左值用. 左值可以出现在=的任何一方, 出现在=右方的左值,是把左值当作右值使用,这是非常正常的.右值,不能当作左值使用. 能够(...
  • qq_24964575
  • qq_24964575
  • 2016年08月14日 09:05
  • 964

C和指针(二)指针与左值、右值详解

c语言中左值、右值定义:例子:a = b + 25; 左值:能够出现在赋值符号左侧的东西。例子中a, 右值:能够出现在赋值符号右侧的东西。例子中b + 25 上面的例子可以写成这样吗? b + 25...
  • u014656992
  • u014656992
  • 2015年11月16日 11:30
  • 1961

C和C++中左值和右值得区别以及++前置和后置的区别

左值是可以出现在表达式左边的值,
  • u013011717
  • u013011717
  • 2014年10月02日 16:11
  • 623
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于i++和++i以及左值,右值
举报原因:
原因补充:

(最多只允许输入30个字)