左值与右值
2014-03-20 11:25
363 查看
前言
首先注意的是"地址y"和"地址y的内容"之间的区别,这是一个相当微妙之处,因为值大多数的编程语言中我们用同一个符号来表示这两样东西,由编译器根据上下文环境判断它们的具体含义。以赋值为例子说明。
分析
x = y;
在这个上下文环境里,符号x的含义是"x所代表的地址",这被称为左值。左值在编译时就可知,左值表示存储结果的地方。
在这个上下文环境里,符号y的含义是"y所代表的地址的内容",这被称为右值。右值直到运行时才知,一般的,右值表示内容。
即,将y的内容赋值给x所在的地址空间。
C语言中引入了"可修改的左值"这个术语,它表示左值可以出现在赋值语句的左边,这个是区分为与数组名的区分。数组名也用于确定对象在内存中的位置,是左值,但它不能作为赋值的对象。
因此数组名是个左值但是个不可修改的左值,Arr是个指针常量,它的值在运行期间是固定不变的,Arr++也就无法实现。
总结
出现在赋值符号左边有时被称为左值(它位于“左手边”,或“表示地址”),出现在赋值符号右边有时则被称为右值(它位于“右手边”)。编译器为每个变量分配一个地址(左值),这个地址在编译的时候就可知,而且该变量在运行时一直保存在这个地址。相反,存储于变量中的值(右值)只有在运行时可知,在需要用到变量中存储的值,编译器才发出指令从指定的地址读入变量值并将它存于寄存器。
******************************************************************
* 转载注明出处,如有歧义,欢迎指正 *
******************************************************************
首先注意的是"地址y"和"地址y的内容"之间的区别,这是一个相当微妙之处,因为值大多数的编程语言中我们用同一个符号来表示这两样东西,由编译器根据上下文环境判断它们的具体含义。以赋值为例子说明。
分析
x = y;
在这个上下文环境里,符号x的含义是"x所代表的地址",这被称为左值。左值在编译时就可知,左值表示存储结果的地方。
在这个上下文环境里,符号y的含义是"y所代表的地址的内容",这被称为右值。右值直到运行时才知,一般的,右值表示内容。
即,将y的内容赋值给x所在的地址空间。
C语言中引入了"可修改的左值"这个术语,它表示左值可以出现在赋值语句的左边,这个是区分为与数组名的区分。数组名也用于确定对象在内存中的位置,是左值,但它不能作为赋值的对象。
int Arr[5]={1,2,3,4,5}; int *p = Arr; for (;Arr<(p+5);Arr++)//**error**,Arr是不可修改的左值 { printf("%d\n",*Arr); }
因此数组名是个左值但是个不可修改的左值,Arr是个指针常量,它的值在运行期间是固定不变的,Arr++也就无法实现。
总结
出现在赋值符号左边有时被称为左值(它位于“左手边”,或“表示地址”),出现在赋值符号右边有时则被称为右值(它位于“右手边”)。编译器为每个变量分配一个地址(左值),这个地址在编译的时候就可知,而且该变量在运行时一直保存在这个地址。相反,存储于变量中的值(右值)只有在运行时可知,在需要用到变量中存储的值,编译器才发出指令从指定的地址读入变量值并将它存于寄存器。
******************************************************************
* 转载注明出处,如有歧义,欢迎指正 *
******************************************************************
相关文章推荐
- C++标准之(ravalue reference) 右值引用介绍
- C++左值表达式
- C++中的左值和右值
- C++左值右值引用
- 基本算数运算符和基本语句之赋值语句
- C Primer Plus 第5章 运算符、表达式和语句 5.2基本运算符
- 左值和右值
- 非常量引用的初始值必须是左值
- 左值和右值
- C++11 右值引用
- 左值和右值
- c++中的左值与右值
- 关于C++中的临时对象/常与非常&左右值/的阐述
- C++11移动语义探讨——从临时对象到右值引用
- JQuery在光标位置插入内容的实现代码
- 用数据库 生成脚本 和 导出数据 来完成数据库迁移
- 关于插件KindEditor 上传图大小的限制
- Oracle 触发器语法及实例
- MapReduce:详解Shuffle过程
- 调试Apache的rewrite规则方法