您的位置:首页 > 编程语言 > C语言/C++

C++左值表达式

2014-03-06 21:39 211 查看
今天我们将要谈论的话题——左值表达式——相信不少人从各种途径中或许了解到一些,若是对这个概念还是模模糊糊,那接着看下去就对了,若是对这个概念十分清楚了,那就帮我找找问题,不吝赐教一下吧!

或许你是从书中了解到这个概念,有些老书可能会写左值表达式就是可以放在赋值运算符左侧作为左操作数的表达式,这种说法在早期或许是没什么问题的,毕竟早期的左值定义是基于赋值运算符需求的,它认为能作为赋值运算符左操作数的表达式就是左值。但这个说法也有一些地方将难以自圆其说,比如数组名,数组是聚集,不是标量类型(标量类型,实际上指的就是C++基本类型,如int, char之类),我们是无法用一个值来表示一个数组的,而赋值运算符则要求左操作数是一个标量类型(结构例外),这显然不合理。因此,早期将数组名定为右值,数组作为完整对象,理应可以取地址,但取地址运算符又要求操作数为左值,这与定义又矛盾了。

说了左值过去的说法,那现在就来讲讲左值现在的说法吧!我们判断一个表达式是否为左值表达式,关键在于:它必须指示一个对象,不管这个对象是有效还是无效,完整还是不完整(关于完整类型,不完整类型下面会提到),另外加一点,在C++中,规定包括非静态类成员函数之外的函数都是左值表达式。下面举个例子:

int i;
int *p = &i;


我们且不管p指向的i内容有效无效,i和p都是指示一个对象的,且具有对象类型,所以它们都是左值,但是虽然&i也有对象类型,但是它并没有指示一个对象,所以它不是左值。这里或许有些人会感动迷糊,&i不是表示了一个地址了么,怎么说是没有指示一个对象呢?在这里,我就引用一句李普曼大师在C++ Primer5里写到的一句话:变量是左值!注意这里的变量说的可不是临时变量!我们应该严格区别一下。由此,我们再看上面,&i是一个临时变量,所以它不算是左值!

我们在上面提到过完整类型和不完整类型,不完整类型其实就是缺少足够的信息,举个例子,比如缺少定义以致不能明确其大小,前向声明也算是常见的一种不完整类型:

class MyClass;
struct S;

看到这里,大家都恍然大悟了吧,原来是这种玩意儿!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 左值 struct