1.求值顺序.
在一个表达式里,子表达式的求值顺序是没有定义的.v[i] = i++;的结果是无定义的.
算符,(逗号),&&(与),||(或)保证了位于它们左边的运算对象一定会在右边的运算对象之前求值.例如,b=(a=2,a+1)将把3赋给b.
考虑f1(v[i],i++)与f2((v[i],i++)).前一个有两个参数,且参数的求值顺序是没有定义的.后一个有一个参数,即逗号表达式的值,它等价于i++.
2.堆存储算符new和delete.
new算符把对象在堆上分配.使用delete能销毁它们,且delete只能用到new返回的指针或0,对0应用不会造成任何影响.
为了释放new分配的空间,delete和delete[]必须能够确定空间的大小.这就意味着通过标准实现的new分配的对象比静态对象稍微大一点的空间.典型的情况下,需要用一个机器字保存对象的大小.
当new无法找到需要分配的空间时会调用一个由set_new_handler()设定的函数,如果未设定该函数则抛出bad_alloc异常.
3.算符的优先级列表.
PrecedenceOperatorDescriptionExampleAssociativity1()[]->.::++--Grouping operatorArray accessMember access from a pointerMember access from an objectScoping operatorPost-incrementPost-decrement(a + b) / 4;array[4] = 2;ptr->age = 34;obj.age = 34;Class::age = 2;for( i = 0; i < 10; i++ ) ...for( i = 10; i > 0; i-- ) ...left to right2!~++---+*&(type)sizeofLogical negationBitwise complementPre-incrementPre-decrementUnary minusUnary plusDereferenceAddress ofCast to a given typeReturn size in bytesif( !done ) ...flags = ~flags;for( i = 0; i < 10; ++i ) ...for( i = 10; i > 0; --i ) ...int i = -1;int i = +1;data = *ptr;address = &obj;int i = (int) floatNum;int size = sizeof(floatNum);right to left3->*.*Member pointer selectorMember pointer selectorptr->*var = 24;obj.*var = 24;left to right4*/%MultiplicationDivisionModulusint i = 2 * 4;float f = 10 / 3;int rem = 4 % 3;left to right5+-AdditionSubtractionint i = 2 + 3;int i = 5 - 1;left to right6<<>>Bitwise shift leftBitwise shift rightint flags = 33 << 1;int flags = 33 >> 1;left to right7<<=>>=Comparison less-thanComparison less-than-or-equal-toComparison greater-thanComparison geater-than-or-equal-toif( i < 42 ) ...if( i <= 42 ) ...if( i > 42 ) ...if( i >= 42 ) ...left to right8==!=Comparison equal-toComparison not-equal-toif( i == 42 ) ...if( i != 42 ) ...left to right9&Bitwise ANDflags = flags & 42;left to right10^Bitwise exclusive ORflags = flags ^ 42;left to right11|Bitwise inclusive (normal) ORflags = flags | 42;left to right12&&Logical ANDif( conditionA && conditionB ) ...left to right13||Logical ORif( conditionA || conditionB ) ...left to right14? :Ternary conditional (if-then-else)int i = (a > b) ? a : b;right to left15=+=-=*=/=%=&=^=|=<<=>>=Assignment operatorIncrement and assignDecrement and assignMultiply and assignDivide and assignModulo and assignBitwise AND and assignBitwise exclusive OR and assignBitwise inclusive (normal) OR and assignBitwise shift left and assignBitwise shift right and assignint a = b;a += 3;b -= 4;a *= 5;a /= 2;a %= 3;flags &= new_flags;flags ^= new_flags;flags |= new_flags;flags <<= 2;flags >>= 2;right to left16,Sequential evaluation operatorfor( i = 0, j = 0; i < 10; i++, j++ ) ...left to right
ps
1.运算符除了常见的+ - * / && ->等符号之外还有一些是用单词表示的,主要有:
sizeof(求大小),typeid(求类型),dynamic_cast,static_cast,reinterpect_cast,const_cast,new,delete,new[],delete[]和?:(条件表达式).
另外c++还把函数调用和值构造expr(expr_list)和type(expr_list)做为运算符。这样可以把函数和类型转换与普通的算符同等对待了。
2.文中的静态对象,它们与堆对象(动态对象)相对,它们是函数里通过变量声明建立起的对象.因此一个类对象既可能是在栈上分配的静态对象,也可能是在堆上分配的动态对象.
3.运算符的优先级一般不需要记忆,但有时会用到。这16个等级中1是域限制符,2是一元算符,3是成员指针,4、5、6是四则运算(移位运算看成四则运算的一种,缩放N倍),7、8是比较算符,9、10、11是位算符,12、13是逻辑算符,14是条件算符,15是赋值算符,16是逗号算符,可分为这十类。其中3和14一般不会与其他算符做优先级比较,逗号算符的优先级最低,因此只要记下剩下七个优先级循序即可。有一句脏话可以帮助记忆:遇一色比猥裸妇。