现在的位置: 首页 > 综合 > 正文

关于’a++’和’++a’和’a+5′是否能作左值的问题

2013年08月13日 ⁄ 综合 ⁄ 共 2530字 ⁄ 字号 评论关闭
在网络上看的几篇文章都说不的不太清楚。也之能做为参考!

定义:
凡是可以“被赋值”的表达式,就叫“左值”,左值总是直接的或间接的变量
凡是可以“赋值给”左值的,就叫“右值”,右值可以是变量、常量、函数调用等
左值定义很简单,只要是能被赋值的就是左值。 

例子:
  void   main() 
  { 
          int   a   =   0; 
          a++   =   1; 
          ++a   =   1; 
          a+5   =   1; 
          a=6   =   1; 
  } 
 编译器会告诉你哪些不是左值。  

解释:
  
  1.什么是左值 
  int   a   =   2; 
  这句话里面2是一个"值",a是一个变量,它有一个4字节的内存区域,这个内存区域里面装着2,这就暗示这个内存区域可以被改写,可以被赋值,可以出现在=号的左边 
  a是一个"左值" 
  而2就仅仅是一个2,它是一个值,我看看到它,就认为它是一个2,只能把他赋给别人,不能被赋值 
  2是一个"右值",而且不能是"左值",而a可以赋值给别人,所以a即是一个"左值"又是一个"右值" 
  
  2.文字常量和变量都可以作右值 
  
  3.所有的左值都是右值,反之就不见得 
  
  <重要>4.并不是左值就是可以赋值的值 
  可以被赋值的左值称为modifiable   l-values 
  不可赋值的左值(nonmodifiable   l-value)大概有 
  a.   常量值,const   int   i;是一个左值,但是他是不可赋值的  (初始化不算)
  b.   一个数组类型,它是左值,但是他是不能赋值的 
  c.   如果一个struct或union里面包含常量值,他就是不可赋值的 
  
  5.左值大概包括 
  a.   An   identifier   of   integral,   floating,   pointer,   structure,   or   union   type   
  b.   A   subscript   ([   ])   expression   that   does   not   evaluate   to   an   array   
  c.   A   member-selection   expression   (–>   or   .)   
  d.   A   unary-indirection   (*)   expression   that   does   not   refer   to   an   array   
  e.   An   l-value   expression   in   parentheses   
  f.   A   const   object   (a   nonmodifiable   l-value)   
  
  6.引用类型永远是左值  (这里因该说的是int a =q;  int * b;   b = &a ;      &是引用吧,那就是右值的吧!)
  
  7.左值通常是一个变量 
  
  8.举一个例子 
  void   main() 
  { 
        int   i,   j,   *p; 
        i   =   7;                         //   Correct.   A   variable   name,   i,   is   an   l-value. 
        7   =   i;                         //   C2106.   A   constant,   7,   is   an   r-value. 
        j   *   4   =   7;                 //   C2106.   The   expression   j   *   4   yields   an   r-value. 
        *p   =   i;                       //   Correct.   A   dereferenced   pointer   is   an   l-value. 
        const   int   ci   =   7;   //   Declare   a   const   variable. 
        ci   =   9;                       //   C2166   ci   is   a   nonmodifiable   l-value,   so   the 
                                            //     assignment   causes   an   error   message   to 
                                            //     be   generated. 
          ((i   <   3)   ?   i   :   j)   =   7;   //   Correct.   Conditional   operator   (?   :)   
                                                      //     returns   an   l-value. 
  } 
  
  8.现在来看++a,a++,a+5,a=6问题 
  ++a   =   22;里面先++a,返回的东西是   a,   而a是一个变量,显然是一个是一个左值,他可被程序寻址,可以改变它的值 
  a++呢?a++是什么东西?a++是一个引用了临时对象的表达式,用户不能寻址该对象,也不能改变它的值,所以它是右值,不是左值 
  a+5也是一个引用了临时对象的表达式,用户不能寻址该对象,也不能改变它的值,所以它是右值,不是左值 
  a=6显然是左值,就不用说了 

我在linux下实验了下跟上面的解释有不同的地方就是(++a   = 1)也是无效的。
  void   main() 
  { 
          int   a   =   0; 
          a++   =   1;  无效左值
          ++a   =   1;  无效左值
          a+5   =   1;  无效左值
          a=6   =   1;  无效左值
  } 

抱歉!评论已关闭.