a++ 和 ++a 的区别

a++ 和 ++a 的区别

 

1)首先说左值和右值的定义:
        变量和文字常量都有存储区,并且有相关的类型。区别在于变量是可寻址的(addressable)对于每一个变量都有两个值与其相联:
                1).它的数据值,存储在某个内存地址中。有时这个值也被称为对象的右值(rvalue,读做are-value).我们也可认为右值的意思是被读取的值(read value)。文字常量和变量都可被用作右值
                2).它的地址值——即存储数据值的那块内存的地址。它有时被称为变量的左值(lvalue,读作ell-value)。我们也可认为左值的意思是位置值(location value)。文字常量不能被用作左值

 

(2) 首先对于a++的实现是:
        int temp;
        temp = a;
        a   = a+1;
        return temp;  // 返回的是编译器自动分配的临时变量temp,而这个temp并不是你程序中定义的可寻址变量的引用 ,也就是说你不能通过地址对temp进行操作.(换句话说就是不能作为左值),因为temp是一个临时变量。

而++a的实现是:
        a = a+1;
        return a;  // 返回值就是a

 

所以 a++ = 5 是错误的。而 ++a = 5 是正确的。

 

a++和++a在做左值的时候有不同,那么左值它首先必须是有特定地址的才能作为左值,否则赋值就没有具体对象。
a++的意思是先复制一份临时数据出来参与周边环境的运算,再自加变量a,可见a++用来参与运算的是一份复制出来的临时数据,这个数据是临时存在而没有固定地址的,不是一个真正的变量。
++a的意思是先自加变量a,再将变量放到周边环境参与运算,那么++a用来参与运算的是有具体地址的变量,所以++a是可以作为左值使用的。
在具体一点可以理解为:
a++返回一个临时变量
++a返回变量的引用

 

a++,a自增1,返回a自增之前的值(右值)
++a,a自增1,返回自增之后的a(左值)
你需要自己明确三个概念:表达式的返回值、左值、右值

 

posted @ 2017-12-01 21:02  lsgxeva  阅读(3295)  评论(0编辑  收藏  举报