标签:结合律 运算 对象 左值 C++ 运算符 Primer 表达式
基本概念
基础
什么是表达式
由一个或多个运算对象组成的,且计算可得一个结果,字面值和变量是最基本的表达式
运算符
表达式中连接多个运算对象的被称为运算符。根据作用的运算对象的数量,运算符分为一元运算符、二元运算符、三元运算符。一些符号可以是多种,比如*
。函数调用也是一种运算符,对运算对象没有限制。
组合运算符和运算对象的类型转换
- 一个表达式含有多个运算符时,需考虑优先级、结合律和运算对象的求值顺序;
- 运算对象的类型可以不一样,类型的转换规则
运算符的重载
除C++语言定义的用于内置类型和复合类型的操作外,例如>>
、<<
、string
和vector
的运算符等,用户可以定义用于类对象的含义。在重载运算符时,可以自定义运算对象和返回类型,而运算对象的个数、优先级和结合律无法更改。
左值和右值
- C++中的表达式要么是左值,要么是右值;
- 当一个对象被用作右值时,用到是对象的值(内容);当用作左值时,用的是对象的身份(在内存中的位置)
- 左值可以用在需要右值的地方;反之不行
- 需要左值的地方:1.赋值运算符左侧需要左值,得到的结果也是左值;2.取地址符;3.内置解引用运算符、下标运算符、迭代器解引用运算符、内置类型和迭代器的递增递减运算符。
- 使用关键字
decltype
时,如果表达式的求值结果是左值,decltype
作用于该表达式(不是变量)得到一个引用类型。
优先级与结合律
如果运算符优先级相同,按照从左向右的顺序组合运算对象。大部分二元运算符满足左结合律,赋值运算符满足右结合律。括号无视优先级与结合律。
求值顺序
- 在一个复合表达式中,各个运算对象的求值顺序是不固定的。例如
int i=fun1()*fun2()
中并不知先调用fun1
还是fun2
。
std::cout << i << ++i << std::end;//错误!未定义的行为,不知道先求 i 还是先求 ++i
- 4种运算符明确规定了运算对象的求值顺序:逻辑与(&&,先左后右)、逻辑或(||,先左后右)、条件(?:,先条件,再分支)、逗号(,从左向右)
- 处理复合表达式的两个建议:
(1)不确定优先级与结合律时使用括号;
(2)如果改变了某个运算对象的值,在同一表达式中不要再使用该运算对象。
运算符优先级表
标签:结合律,运算,对象,左值,C++,运算符,Primer,表达式 来源: https://www.cnblogs.com/SHU98/p/16457707.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。