1、函数调用也是一种特殊的运算符,对运算对象的个数不作限制。
2、几元运算符,是基于作用的对象的数量。
3、不同类型的运算对象进行运算,可能会出现类型转换,一般情况下小整数类型会被转换成较大的整数类型,当然,还可能有其他情况的类型。
4、重载运算符的优先级和结合律是无法改变的,但是可以改变运算对象的类型和返回值的类型。
5、当一个对象被用作右值时,那么用的是这个对象的值(内容),当这个对象被用作左值时,用的是这个对象在内存中的地址。
6、在一个需要右值的地方可以使用左值代替,但是不能用右值去替代左值使用。
7、取地址一个运算对象,返回的是指向它的指针。这个指针是右值。
8、使用decltype时,如果表达式中的值是左值的话,推断出来的类型是引用类型。
9、算术运算符满足左结合律,当优先级相同时,从左到右结合。
10、对于没有指定执行顺序的运算符来说,如果表达式指向并修改同一个对象,将引发错误并产生未定义的行为。就是说这些运算符对象,不能相互有影响或者有IO任务,在同一个表达式中。否则其行为未定义。
11、如果改变了某个运算对象的值,在表达式的其他地方不要再使用这个运算对象。当且仅当所改变的运算对象的子表达式的本身,就是另一个子表达式的运算对象时无效。简单的说,就是当两个运算符共用一个同一个运算对象时并且有优先级顺序时,无效。
12、除非另做特殊说明,凡是算术运算符,都能够作用于任意的算术类型,或者能够转换成算术类型的类型。
13、当一个一元正号运算符或者一元负号运算符作用于一个指针或者算术值时,返回运算的对象值的一个副本(提升后)。
14、算术表达式出现未定义的结果,有两方面的原因:一方面是,数学性质,例如除数不为0;另一方面是,计算机本身的特点,例如溢出,计算的结果超出了类型所能表示的范围。
15、参与取余或取模运算的运算对象必须是整数类型,进行除法运算时,如果运算对象的符号不同,则商为负值,早期C++支持负值的商向上或者向下取整,C++11新标准下,商一律向0取整(即舍弃掉小数部分)。
16、早期的C++,允许m%n的符号匹配n的符号,并且商的值向负无穷一侧取整,但是新标准下的是禁止的。除非是-m导致溢出的情况,不然(-m)/n,m/(-n),其值都等于-(m/n),m%(-n)等于m%n,(-m)%n等于-(m%n)。也就是说对于/运算符,任意其中一个运算对象的值为负,都等于整个正的运算对象求值取负号,而对于%运算符,只有对m取负,才等于整个正的运算对象求值取负号。
17、算术表达式不应该参与布尔运算。并且它的结果是右值。
18、关系运算符作用于算术类型或者指针类型,逻辑运算符作用于任意能转换成布尔值的类型。其中逻辑非优先级大于关系运算符(比较大小的运算符>=等运算符优先级大于判断是否相等的关系运算符)大于其他逻辑运算符。
19、所谓短路求值,是指当左侧运算对象无法确定整个表达式的值时,才对右侧表达式进行计算。
20、如果想测试一个算术对象或者指针的真值,最直接的方法就是让它作为if语句的条件。在进行比较时,如果比较的对象是布尔型时才去使用布尔字面值作为运算对象,否则不要使用。
21、赋值运算符的左侧运算对象如果是内置类型,那么初始值列表最多只能一个值,如果类型不同,那么发生转换的话,转换后值的大小也不应该超过目标类型的空间大小。如果左侧对象是类类型,则根据其自身类的定义决定。
22、无论左侧运算对象的类型是什么,初始值列表都可以为空,编译器会提供一个值初始化的临时量去初始化。
23、赋值运算符满足的是右结合律,所以先计算右边对象或者表达式的值。赋值运算符优先级次低的仅高于逗号运算符。
24、a op=b;等价于a=a op b; 前者a的值计算一次,而后者计算两次,一次是作为右边子表达式的一部分求值,另一部分是作为左边对象求值。除了对程序性能有影响,其他的没有多大影响。
25、递增、递减运算符的前置形式和后置形式作用的对象都是左值运算对象,前置版本将对象本身作为左值返回,后置版本将对象原始值作为副本拷贝一份作为右值返回,然后其本身再递增递减。尽量使用前置版本。
26、点运算符和箭头运算符作用是一样的,都是用来访问类对象的成员,区别在于(*ptr).mem和ptr->mem,这是由于解引用的运算符优先级低于点运算符,而且箭头运算符结果是一个右值,而点运算符的结果是根据其成员所属的对象是左值还是右值,若是左值结果就为左值,若为右值,结果就是右值。就是说因为指针所指的对象一定是一个左值,所以使用->返回的成员也一定是左值。而对右值对象调用成员调用运算符(.)是合法行为,但是这个被调用的成员在对象被销毁时也一并被销毁,所以整个成员也是右值。
27、条件运算符的表达式如果是左值或者可以在转换成同一种左值类型时,运算的结果就是左值,否则运算的结果就是右值。并且条件运算符的表达式必须是同一种类型或者可以转换成同一种类型的。
28、条件运算符可以作为另外的条件运算符的cond或者expr,条件运算符满足右结合律,一般情况下是从右向左的顺序进行结合,典型的就是嵌套条件运算符,先结合其靠右的条件运算符构成分支。
30、嵌套条件运算符如果嵌套过多会让程序的可读性降低,所以不要嵌套过多层的条件运算符。
31、由于条件运算符的优先级极低,所以若要在输出中使用条件运算符,那么需要对其加括号提高运算优先级。
32、位运算符是作用于整数类型的运算对象,并且把运算对象看成二进制的集合。如果运算对象是小整型,那么其值会被自动提升成较大的整型。《C++ primer fifth》中强烈建议我们将位运算符用于处理符号类型。
33、移位运算符<<和>>,与标准IO库的输入输出一样,只不过后者是前者的重载之后的,内置类型的<<和>>是对其运算对象执行基于二进制位的移动操作。左侧运算对象根据右侧运算对象移动指定的位数,并且将左侧运算对象的值拷贝一份作为求值结果。
35、移位时右侧运算对象的值不能是负数,并且值必须是小于结果的位数。二进制的移位,移出了边界的位就被舍弃了。