形如以下的一个表达式,char *p = &somechar;
我们知道p是指向字符的指针变量,作为一个变量,它的内容为somechar的地址,它的指向对象为somechar
然而,p不是不可以指向其它的字符,比如我们p=&anotherchar;这同样成立。
我们说,在赋值表达式char *p=&somechar;中,等号右边的&somechar是一个右值,等号左边的p是左值;也可这样说,对于char *p=&somechar;显然等号左边也为一个表达式,在这个表达式中,p是左值,而
*p是右值。左值与右值的概念与区别最初来源于编译原理,大致是指表达式两边的左右值是有严格区别的,分左右的,在C中,左值就是可以改变其值(被赋值)的一方,所以要求赋值表达式的左边是一个"变量"(不管右值是什么,左值
接受右值的内容,此例中为&somechar,是一个value,然而语义上可以看作为指针);而右值可以是变量,也可以是常量,或者临时值。(不管怎么样,它有值提供给左值就行) 归纳起来就是,右值把它的“值”(是个值或地址值)赋给左值所指的“地址”(必须是个有地址的量,比如不能对常量赋值)所以在C中,左值一般指能变动其内容的,有地址的变量,而右值就是有值,可变动或不变,但不一定要求其有地址的量。但不能单纯的其值变动或不变动来判断,比如char *p = &somechar;的表达式中,显然地,p和*p都不固定可以变动其内容。所以判断的唯一依据是:赋值中,是哪方把哪方的值赋给了哪方地址所在的空间。在C++中这两个概念经过了改动。因为C++引入了引用这个东西,还有引用到常量。形如int& max(int a,int b)的函数表达式中,max因为本质上是一个返回int的函数引用“类型”,函数引用也是一种“语言类型”,而且它有一个地址(函数都有地址),而且这里还有&,所以它是一个左值。而形如int* max(int a,int b)的函数表达式中,max因为本质上是一个返回int的函数指针“类型”,函数指针类型也是一种“语言类型”,而且max必有一个地址,但它表明的是一个函数值,所以它是一个右值。试归纳之,具名(显式给出了其名字)对象就是左值,不具名对象就是右值。所以,对于C和C++来说,总的判断步骤可以如下进行: 1,分解认识出表达式(左,右,或整个表达式)内含的“量”的类型; 2,因为任何类型都是语言的类型,所以可能有地址,有值。 3,具名且有地址的就可以是左值,不具名而且有值的就可以是右值。
我们知道p是指向字符的指针变量,作为一个变量,它的内容为somechar的地址,它的指向对象为somechar
然而,p不是不可以指向其它的字符,比如我们p=&anotherchar;这同样成立。
我们说,在赋值表达式char *p=&somechar;中,等号右边的&somechar是一个右值,等号左边的p是左值;也可这样说,对于char *p=&somechar;显然等号左边也为一个表达式,在这个表达式中,p是左值,而
*p是右值。左值与右值的概念与区别最初来源于编译原理,大致是指表达式两边的左右值是有严格区别的,分左右的,在C中,左值就是可以改变其值(被赋值)的一方,所以要求赋值表达式的左边是一个"变量"(不管右值是什么,左值
接受右值的内容,此例中为&somechar,是一个value,然而语义上可以看作为指针);而右值可以是变量,也可以是常量,或者临时值。(不管怎么样,它有值提供给左值就行) 归纳起来就是,右值把它的“值”(是个值或地址值)赋给左值所指的“地址”(必须是个有地址的量,比如不能对常量赋值)所以在C中,左值一般指能变动其内容的,有地址的变量,而右值就是有值,可变动或不变,但不一定要求其有地址的量。但不能单纯的其值变动或不变动来判断,比如char *p = &somechar;的表达式中,显然地,p和*p都不固定可以变动其内容。所以判断的唯一依据是:赋值中,是哪方把哪方的值赋给了哪方地址所在的空间。在C++中这两个概念经过了改动。因为C++引入了引用这个东西,还有引用到常量。形如int& max(int a,int b)的函数表达式中,max因为本质上是一个返回int的函数引用“类型”,函数引用也是一种“语言类型”,而且它有一个地址(函数都有地址),而且这里还有&,所以它是一个左值。而形如int* max(int a,int b)的函数表达式中,max因为本质上是一个返回int的函数指针“类型”,函数指针类型也是一种“语言类型”,而且max必有一个地址,但它表明的是一个函数值,所以它是一个右值。试归纳之,具名(显式给出了其名字)对象就是左值,不具名对象就是右值。所以,对于C和C++来说,总的判断步骤可以如下进行: 1,分解认识出表达式(左,右,或整个表达式)内含的“量”的类型; 2,因为任何类型都是语言的类型,所以可能有地址,有值。 3,具名且有地址的就可以是左值,不具名而且有值的就可以是右值。