a+++++b中a++不能做左值

来源:互联网 发布:淘800淘宝网 编辑:程序博客网 时间:2024/05/21 19:36
1)首先说左值和右值的定义:

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

 

(2)

首先对于i++的实现是:  
                                             int   temp;  
                                             temp   =   i;  
                                             i   =   i+1;  
                                             return   temp;  
而++i的实现是:  
                                              i   =   i+1;  
                                              return   i;              
               所以对于我们提出来的问题已经能得到解决了:
i++=5; 是错误的是因为i++返回的是编译器自动分配的临时变量temp,而这个temp并不是你程序中定义的可寻址变量的引用 ,也就是说你不能通
过地址对temp进行操作.(换句话说就是不能作为左值),因为temp是一个临时变量


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

根据编译器的贪婪法原则应该解释为:

   a  ++  ++   + b
 等价于:  ((a++)++)+b  
 但是这个式子是不正确的,因为a++的結果不能作左值。  
    通俗地讲:左值就是一个可被存储的单元,右值就是一个可被读取的数据.
 如果在程序中这么写的话编译器会提示缺少左值.也就是说a++作为++的操作数是不可接受的。于是,解析词法不明确性的规则使得以语法上有意义的方式解析该示例变得不可能。应该避免出现这种写法.
 所以正确的分析应该为:  
  ++   ++  b等价于:  
 (a++)+(++b)   

0 0