C++提供了一元操作符(unary operator)和二元操作符(binary operator)两种操作符,C++还提供了一个使用三个操作数的三元操作符(ternary operator)。
5.1 算术操作符
一元操作符具有直观的含义,它对其操作数取负。
操作溢出时,其结果值"截断",将符号位的值由0设为1,于是结果变为负数。
int i = 100;
cout << -i << endl;
5.2 关系操作符和逻辑操作符
对于逻辑与操作符,一个很有价值的用法是:如果某边界条件使expr2的计算变得危险,则应在该条件出现之前,先让expr1的计算结果变为false。
string str1("AndersFan");
string::iterator i = str1.begin();
while(i!=str1.end() && !isspace(*i))
{
cout << *i;
i++;
}
cout << endl;
不应该串联使用关系操作符。
bool值false用0表示,而true则为1。
5.3 位操作符
移位操作的右操作数不可以是负数,而且必须是严格小于左操作数位数的值。
位异或操作符(^)也需要两个整型操作数。在每个位的位置,如果两个操作数对应的位只有一个为1,则操作结果中该位为1,否则为0.
5.3.1 bitset对象或整型值的使用
一般而言,标准库提供的bitset操作更直接、更容易阅读和书写、正确使用的可能性更高。而且,bitset对象的大小不受unsigned数的位数限制。通常说,bitset优于整型结构的低级直接位操作。
bitset<30> bit;
bit |= true << 27;
cout << bit << endl;
5.3.2 将移位操作符用于IO
像其他二元操作符一样,移位操作符也是左结合的。这类操作符从左向右地结合。
移位操作符具有中等优先级:其优先级比算术操作符低,但比关系操作符、赋值操作符和条件操作符优先级高。
5.4 赋值操作符
5.4.1 赋值操作的右结合性
C++语言允许将这多个赋值操作写在一个表达式中。
int i, j, k;
i = j = k = 1000;
与其他二元操作符不同,赋值操作具有右结合特性。
5.4.2 赋值操作具有低优先级
谨防混淆相等操作符和赋值操作符。
5.4.3 复合赋值操作符
+= -+ *= etc...