240806 C++ Primer ch4
什么是Expression(表达式):
- 由一个或多个operands(运算对象)组成,对表达式evaluate(求值)会得到一个结果。
- 最简单的表达式就是literal(字面量)或variable(变量),对它们求职得到的就是字面量或变量的值。
4.1 Fundamentals
4.1.1 Basic Concepts
function call ()
也是一个operator(运算符),而且它的运算对象的个数没有限制。
Overloaded Operators
对于class type(类类型),虽然我们可以overload(重载)运算符,但是运算符的运算对象的个数,precedence(优先级),associativity(结合律)都是不能改变的。
Lvalues and Rvalues
Lvalue(左值)和Rvalue(右值),是从C语言继承来的名词。原本意义是,左值可以放在assignment的左边,ravalue不行。
但是在C++里,左值和右值的意义就比较复杂。粗略的说,当我们使用一个左值,我们使用的是这个object(对象)的identity(身份)(内存中的位置);当我们使用一个右值,我们用的是这个对象的值。
但不论如何,我们讨论左值和右值的时候,都是在讨论表达式,而不是在讨论变量或者其他。
4.1.2 Precedence and Associativity
优先级也好,结合律也好,要讨论它们,得是在有多个运算符的情况下才能体现意义。
优先级是指运算对象组合的紧密程度。高优先级的运算符比低优先级的运算符更能组合运算对象。比如1+2*3
,*
优先级更高,它能组合2和3,而+
的优先级低,它就不能组合1和2,而只能组合1和2*3
的结果。
结合律是指在有相同优先级的运算符出现的情况下,运算对象该从左往右还是从右往左进行组合。比如1+2+3
,它是left associative,也就是从左往右组合,先是组合1和2,然后是组合1+2
的结果和3。
4.1.3 Order of Evaluation
优先级和结合律只规定了运算对象怎么组合,但是没有说它们被求值的顺序。
比如f、g、h是三个函数,在这个表达式f()+g()*h()
里,f()、g()、h()哪个会先被求值我们是无法知道的。
在这种情况下,如果一个表达式里同时使用并改变了一个对象,求值结果是undefined(未定义的)。
1 | int i = 0; |
- 如果左边的i先被求值,然后右边的
++i
才被求值,输出的结果是0 1
。 - 如果右边的
++i
先被求值,输出的结果是1 1
。
Order of evaluation for most of the binary operators is left undefined to give the compiler opportunities for optimization.
大多是二元运算符evaluation(求值)的顺序是未定义的,这是为了给编译器进行优化的空间。
4.2 Arithmetic Operators
所有 arithmetic type(算术类型),或者可以被转换成算术类型的运算对象,都能用Arithmetic Operator(算术运算符)。
算术运算符的运算对象和结果都是右值。
有些算术表达式的结果是未定义的。而且往往没有编译警告或者运行时警告。
Consider amachine onwhich shorts are 16 bits. In that case, themaximum short is 32767. On such a machine, the following compound assignment overflows:
1 | // EN p140 |
The assignment to short_value is undefined.
关于%
运算符(取余或取模运算符),详见另一篇“取模运算的一些发现”文章。
4.3 Logical and Relational Operators
Logical AND and OR Operators
&&
,||
这两个运算符规定了运算顺序,求值顺序是先对左边运算对象求值,然后根据结果再看要不要对右边的运算对象求值。
4.4 Assignment Operators
4.11.3 Explicit Conversions
static_cast and reinterpret_cast both can convert a void pointer to other type pointer, but only reinterpret_cast can convert between two unrelated type pointer.
1 | char *pc; |
1 | char *pc; |
感想
第四章章节看起来挺多的,其实读起来感觉也没有很多,只是很杂,因为讲了很多不同的操作符