您的位置:首页 > 其它

左值与右值

2015-09-11 21:36 197 查看
左值就是那些能够出现在赋值符号左边的东西。

右值就是那些可以出现赋值符号右边的东西。

例如:

a
= b + 25;

a就是一个左值,因为它标识了一个可以存储结果值的地点,b +
25是个右值,因为它指定了一个值。但是它们可以互换吗? b + 25 = a; 原先用作左值的a此时也可以当作右值,因为每个位置都包含一个值。然而,b + 25不能作为左值,因为它并未标识一个特定的位置。因此,这条赋值语句是非法的。

注意当计算机计算b + 25时,它的结果必然保存于机器的某个地方。但是,程序员并没有办法预测该结果会存储在什么地方,也无法保证这个表达式的值下次还会存储于那个地方。其结果是,这个表达式不是一个左值。基于同样的理由,字面值常量也都不是左值。

听上去似乎是变量可以作为左值而表达式不能作为左值,但这个推断并不准确。在下面的赋值语句中,左值便是一个表达是式。

int a[30];

...

a[b + 10] = 0;

下标引用实际上是一个操作符,所以表达式的左边实际上是表达式,但它却是一个合法的左值,因为它标识一个特定的位置,我们以后可以在程序中引用它。这里另外一个例子:

int a, *pi;

...

pi = &a;

*pi = 20;

第2条赋值语句,它左边的那个值显然是一个表达式,但它却是一个合法的左值。为什么?指针pi的值是内存中某个特定位置的地址,*操作符使机器指向那个位置。当它作为左值使用时,这个表达式指定需要进行修改的位置。当它作为右值使用时,它就是提取当前存储于这个位置的值。

指针中的左右值举例:

char cp = 'a';

char *cp = &ch;

1、&ch 可以作为右值,但是不能作为左值。为什么这个不是一个合法的左值?因为&操作符的结果是一个右值,它不能当作左值使用。当表达式&ch进行求值时,它的结构应该存储于计算机的什么地方呢?它肯定会位于某个地方,但你无法知道它位于何处。这个表达式并未标识任何机器内存的特定位置,所以它不是一个合法的左值。

2、cp 可以作为左值,也可以作为右值

3、&cp 可以作为右值,但是不可以作为左值。

4、*cp 可以作为右值,也可以作为左值。

5、*cp + 1 可以作为右值,但是不可以作为左值。*的优先级高于+,所以首先执行间接访问操作,我们可以得到它的值。我们取得这个值的一份拷贝并把它与1相加,表达式的最终结果为字符'b'。这个表达式的最终结果的存储位置并未清晰定义,所以它不是一个合法的左值。优先级表格证实+的结构不能作为左值。

6、*(cp + 1) 可以作为右值,也可以作为左值。

7、++cp 可以作为右值,也可以作为左值。 该表达式返回的是操作数本省(左值),内部实现无临时变量!!

8、cp++ 可以作为右值,但是不可以作为左值。该表达式返回的是一个操作数的拷贝,内部实现有临时变量并返回该临时变量!!由于该临时变量无所指,故不能赋值。
后缀++操作符同样增加cp的值,但它先返回cp值的一份考本然后再增加cp的值。这样,这个表达式的值就是cp原来的值的一份拷贝。

9、* ++cp 可以作为右值,也可以作为左值。

10、*cp++ 可以作为右值,也可以作为左值。

11、++*cp 可以作为右值,但是不可以作为左值。 由于这两个操作符的结合性都是从右向左,所以首先执行的是间接访问操作,然后,cp所指向的位置的值增加1,表达式的结构是这个增值后的值的一份拷贝。

12、(*cp) ++ 可以作为右值,但是不可以作为左值。

13、++*++cp 可以作为右值,但是不可以作为左值。

转自:http://blog.sina.com.cn/s/blog_8af6bbd10100ybid.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: