左值与右值

前言

        首先注意的是"地址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++也就无法实现。

总结

       出现在赋值符号左边有时被称为左值(它位于“左手边”,或“表示地址”),出现在赋值符号右边有时则被称为右值(它位于“右手边”)。编译器为每个变量分配一个地址(左值),这个地址在编译的时候就可知,而且该变量在运行时一直保存在这个地址。相反,存储于变量中的值(右值)只有在运行时可知,在需要用到变量中存储的值,编译器才发出指令从指定的地址读入变量值并将它存于寄存器。

******************************************************************

*          转载注明出处,如有歧义,欢迎指正                      *

******************************************************************

 

posted @ 2014-03-20 11:26  小怪兽&奥特曼  阅读(168)  评论(0编辑  收藏  举报