a++ 与 ++a 是不是左值?为什么?

来自csdn的讨论帖:http://bbs.csdn.net/topics/10284793

贴上某人的总结:


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. 如果一个structures或unions里面包含常量值,他就是不可赋值的

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.引用类型永远是左值

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显然是左值,就不用说了

这样说,大家理解了吗?
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值