C++左值表达式
2014-03-06 21:39
211 查看
今天我们将要谈论的话题——左值表达式——相信不少人从各种途径中或许了解到一些,若是对这个概念还是模模糊糊,那接着看下去就对了,若是对这个概念十分清楚了,那就帮我找找问题,不吝赐教一下吧!
或许你是从书中了解到这个概念,有些老书可能会写左值表达式就是可以放在赋值运算符左侧作为左操作数的表达式,这种说法在早期或许是没什么问题的,毕竟早期的左值定义是基于赋值运算符需求的,它认为能作为赋值运算符左操作数的表达式就是左值。但这个说法也有一些地方将难以自圆其说,比如数组名,数组是聚集,不是标量类型(标量类型,实际上指的就是C++基本类型,如int, char之类),我们是无法用一个值来表示一个数组的,而赋值运算符则要求左操作数是一个标量类型(结构例外),这显然不合理。因此,早期将数组名定为右值,数组作为完整对象,理应可以取地址,但取地址运算符又要求操作数为左值,这与定义又矛盾了。
说了左值过去的说法,那现在就来讲讲左值现在的说法吧!我们判断一个表达式是否为左值表达式,关键在于:它必须指示一个对象,不管这个对象是有效还是无效,完整还是不完整(关于完整类型,不完整类型下面会提到),另外加一点,在C++中,规定包括非静态类成员函数之外的函数都是左值表达式。下面举个例子:
我们且不管p指向的i内容有效无效,i和p都是指示一个对象的,且具有对象类型,所以它们都是左值,但是虽然&i也有对象类型,但是它并没有指示一个对象,所以它不是左值。这里或许有些人会感动迷糊,&i不是表示了一个地址了么,怎么说是没有指示一个对象呢?在这里,我就引用一句李普曼大师在C++ Primer5里写到的一句话:变量是左值!注意这里的变量说的可不是临时变量!我们应该严格区别一下。由此,我们再看上面,&i是一个临时变量,所以它不算是左值!
我们在上面提到过完整类型和不完整类型,不完整类型其实就是缺少足够的信息,举个例子,比如缺少定义以致不能明确其大小,前向声明也算是常见的一种不完整类型:
看到这里,大家都恍然大悟了吧,原来是这种玩意儿!
或许你是从书中了解到这个概念,有些老书可能会写左值表达式就是可以放在赋值运算符左侧作为左操作数的表达式,这种说法在早期或许是没什么问题的,毕竟早期的左值定义是基于赋值运算符需求的,它认为能作为赋值运算符左操作数的表达式就是左值。但这个说法也有一些地方将难以自圆其说,比如数组名,数组是聚集,不是标量类型(标量类型,实际上指的就是C++基本类型,如int, char之类),我们是无法用一个值来表示一个数组的,而赋值运算符则要求左操作数是一个标量类型(结构例外),这显然不合理。因此,早期将数组名定为右值,数组作为完整对象,理应可以取地址,但取地址运算符又要求操作数为左值,这与定义又矛盾了。
说了左值过去的说法,那现在就来讲讲左值现在的说法吧!我们判断一个表达式是否为左值表达式,关键在于:它必须指示一个对象,不管这个对象是有效还是无效,完整还是不完整(关于完整类型,不完整类型下面会提到),另外加一点,在C++中,规定包括非静态类成员函数之外的函数都是左值表达式。下面举个例子:
int i; int *p = &i;
我们且不管p指向的i内容有效无效,i和p都是指示一个对象的,且具有对象类型,所以它们都是左值,但是虽然&i也有对象类型,但是它并没有指示一个对象,所以它不是左值。这里或许有些人会感动迷糊,&i不是表示了一个地址了么,怎么说是没有指示一个对象呢?在这里,我就引用一句李普曼大师在C++ Primer5里写到的一句话:变量是左值!注意这里的变量说的可不是临时变量!我们应该严格区别一下。由此,我们再看上面,&i是一个临时变量,所以它不算是左值!
我们在上面提到过完整类型和不完整类型,不完整类型其实就是缺少足够的信息,举个例子,比如缺少定义以致不能明确其大小,前向声明也算是常见的一种不完整类型:
class MyClass; struct S;
看到这里,大家都恍然大悟了吧,原来是这种玩意儿!
相关文章推荐
- 关于C++表达式的左值
- C++ 表达式基础知识(左值、右值未掌握)
- 表达式左值右值(C++学习)
- 表达式左值右值(C++学习)
- C++表达式和左值
- C/C++左值性精髓 哪些表达式是左值,哪些是右值
- 转:表达式左值右值(C++学习) .
- C++中出现“IntelliSense: 表达式必须是可修改的左值”的Bug解决
- C++_利用栈进行运算符表达式的运算
- 4 C++ Boost 正则表达式
- c++中优化内存分配:new/delete操作符;allocator类对象的使用;operator new/operator delete函数及定位new表达式
- C++输出回文数用循环控制语句编写程序,完成表达式的计算
- c++ 中缀表达式转后缀表达式 计算器
- 3.10 左值和右值 中英文对照(C++标准中文版 ISO/IEC 14882:2014)
- C/C++ 移位运算 使表达式的值与变量的第n位相同
- 说说C语言与C++的有些区别(一)----为什么C语言没有BOOL类型,而C++有;枚举类型的区别;左值
- C++正则表达式提取匹配到的字符串
- c/c++表达式求值,即包含加减乘除以及括号的式子(栈)
- C++左值与右值之间共同与不同点解析
- C++程序设计实验报告(十六)----用循环控制语句编写程序,完成表达式的计算