左值与右值
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
右值就是那些可以出现赋值符号右边的东西。
例如:
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
相关文章推荐
- lufylegend学习笔记之二
- knockoutjs + easyui.treegrid 可编辑的自定义绑定插件
- 每日一“结”(4)
- android 开发--抓取网页解析网页内容的若干方法(网络爬虫)(正则表达式)
- HDU 2008 数值统计
- Dual Master 复制架构(Master-Master)
- HDU 2089 不要62 (数位DP)
- Objective-C( Foundation框架 一 NSNumber(NSValue))
- (4.1.35.2)Android 重写系统Crash处理类,保存Crash信息到SD卡 和 完美退出程序的方法
- 导航控制器UINavigationController
- 海量数据搜索
- 数位DP总结
- jQuery 事件探秘
- uva 12275 - Sensor network(生成树)
- LeetCode -- Binary Tree Zigzag Level Order Traversal
- Scala 深入浅出实战经典 第85讲:Scala中For表达式的强大表现力实战
- 【Java笔记】——如何理解线程
- android开发第三弹--SharedPreferences工具类
- uva424高精度
- 黑马程序员——java基础知识篇——>标识符、关键字、常量、进制表示、数据类型、运算符等