第4章—表达式 4.1节基础
1、表达式
(1)表达式的定义:表达式至少由一个或多个运算对象组成,对表达式求值将得到一个结果。复杂的表达式由一个运算符或多个运算符和一个运算对象或多个运算对象组成。
(2)最简单的表达式:字面值和变量。
2、运算符的种类
(1)一元运算符:作用于一个运算对象的运算符,取地址符(&),解引用符(*)等。
(2)二元运算符:作用于两个运算对象的运算符,如加减乘除运算符(+,-,/)等。
(3)三元运算符:作用于三个运算对象的运算符。
(4)多元运算符:函数调用是一种特殊的运算符,它对运算对象的数量没有限制。
3、重载运算符
(1)C++语言已经定义了运算符作用于内置类型和复合类型的运算对象时所执行的操作。
(2)当运算符定义于类类型的运算对象时,用户可以自定义其含义。
(3)重载运算符的含义:给已经定义的运算符赋予另外一层含义。例如:只能作用于内置类型和复合类型的运算对象的运算符可以赋予另外一层含义,即运算符可以作用于类类型的运算对象。如IO库的>>和<<运算符以及string对象,vector对象及迭代器使用的运算符都是重载的运算符。
注意:我们使用重载运算符时,其包括运算对象的类型和返回值的类型,都是由该运算符决定的;但是运算对象的个数,运算符的优先级和结合律是无法改变的。
4、理解复杂表达式含义的必要条件
(1)运算符的优先级:优先级规定了运算对象的组合方式
①每种运算符都有自己的优先级,优先级高的运算符先作用于运算对象。
(2)运算符的结合律
①优先级相同时,则运算符和运算对象的组合取决于结合律。
②若算数运算符满足左结合律,当运算符的优先级相同时,将按照从左往右的顺序组合运算对象。
③若算数运算符满足右结合律,则顺序从右往左组合运算对象。
④注意:括号无视优先级和结合律,先对括号内进行组合,在进行其它操作。
5、运算对象的求值顺序
(1)大多数的运算符不会明确指定运算对象求值的顺序。
(2)有4种运算符明确规定了运算对象的求值顺序。
a、逻辑与运算符(&&);
b、逻辑或运算符(||);
c、条件运算符(?😃;
d、逗号运算符(,);
③使用注意:对于没有明确求值顺序的运算符来说,如果改变某个运算对象的值,在表达式的其他地方不要再使用这个运算对象。
③的一个重要例外:当改变运算对象的子表达式本身就是一个另外一个子表达式的运算时上述的规则无效,例如*解引用符(++iter);
6、运算对象的转换
(1)整数和浮点型可以互相转换。
(2)小整数类型(如bool,char,short)通常会被提升成较大整数类型(如int)。
7、左值和右值
(1)表达式不是左值就是右值。
(2)当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。
(3)不同运算符对运算对象的要求也不同,有的需要左值对象,有的需要右值对象,返回值也不一样,有的是左值结果,有的是右值结果。
(4)重要的原则:在需要右值的地方可以用左值替代,但反之不可以,当左值替代右值时,其实使用的是左值的值。