运算符分为一元运算符、二元运算符、三元运算符(条件运算符)、调用运算符(不规定运算对象数量)
算术运算符:
算术运算符的运算对象和求值结果都是右值。
注意溢出问题(超出该类型所能表示的范围)
取模运算符 % :m%n = m - m/n *n
参与取模运算的运算对象必须是整型.
C++11新标准规定商一律向0取整(抛弃掉小数位)。
取模运算结果的符号匹配m的符号。
逻辑和关系运算符:
很明显运算对象和结果都是右值(用值进行比较,不对元素本身进行操作)
注意短路求值。
不要将关系运算符连写,不然第二个比较运算符的左侧运算对象会是第一个的结果。
赋值运算符:
赋值运算符是对变量的修改,所以其左侧对象必须是一个可修改的左值。它的结果是他的左侧对象也是一个左值。
赋值运算符满足右结合律。(显然,我们是把一个值写到变量里)
int ival , jval; ival = jval =1; //都被赋值为1
对于多重赋值语句中的对象,其类型要不然与右边对象类型相同,要不然可以由右侧对象转换得到。
如果运算符两侧的对象类型不同,右侧对象将转换为左侧对象的类型。
复合赋值运算符:复合赋值运算符只求值一次,普通运算符会求值两次(创建一个临时变量)
递增和递减运算符:
前置版本: 运算对象是左值,返回结果是左值。
后置版本: 运算对象是左值,返回结果是右值(原始值的副本)
注意混用解引用和递增运算符以及求值顺序问题。
成员访问运算符:
箭头运算符作用域一个指针类型的运算时对象,结果是一个左值。(因为一个正确指针指向的一定是一个左值)
点运算符结果的类型和他的左侧运算对象的类型一样(对象时左值还是右值)
条件运算符:
条件运算符满足右结合律。
条件运算符只对一个结果表达式求值。
条件运算符的两个结果表达式必须类型相同或者能转换为某个公共类型。
当条件运算符的两个表达式都是左值或者能转换成同一种左值类型时,运算的结果是左值,否则是右值。(不太懂,跟编译器有关吧?)
位运算符:
与、或、异或、移位、求反。
位运算符作用于整型对象。
移位运算符满足左结合律。
注意符号位问题。
sizeof运算符:
右结合律。
返回一条表达式或一个类型名字所占的字节数。结果是一个size_t类型的常量表达式。
sizeof并不实际计算运算对象的值。
对char或者类型为char的表达式执行sizeof运算,结果为1.
对数组执行sizeof运算得到整个数组所占空间的大小。(所有元素sizeof的结果求和)
对string或者vector只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间。(元素数量?)
逗号运算符:
求值顺序:从左向右依次求值,返回的是右侧表达式的值。
如果结果类型与右侧运算对象类型相同(左值还是右值)。