赋值运算符
赋值运算满足右结合律
int i=j=0; //先计算j=0;然后将j赋值给i
赋值运算符优先级较低
while((i = get()) != 1){} //此处while的条件中一定要加括号,否则会出问题
赋值运算符(=)和相等运算符(==)是有区别的
递增和递减运算符
int i=0,j;
j = ++i; //j=1,i=1 前置版本得到递增之后的数值
j = i+; //j = 1,i = 2,后置版本得到递增之前的值
后置递增运算符的优先级高于解引用运算符
while(p != v.begin() && *p >=0)
cout<<*p++<<endl; //解引用运算符的运算对象是p未增之前的值,*p++相当于*(p++)
*p = toupper(*p++); //这种做法错误,当等式两边都用到p,并且右侧还改变了了p的值,会报错
成员访问运算符
点运算符和箭头运算符都可以用于访问成员:p->mem等价于(*p).mem,解引用运算符优先级低于点运算符
条件运算符
string finalgade = (grade < 60)?"fail" : "pas";
嵌套条件运算符从左向右读
输出表达式中使用条件运算符
1.cout<<((grade < 60)?"fail" : "pass"); //输出pass或者fail
2.cout<<(grade < 60)?"fail" : "pass"; //输出1或者0
cout<<(grade < 60); //输出1或者 0
cout ? "fail" : "pass"; //根据cout的值来决定pass还是fail
3.cout<<grade < 60?"fail" : "pass"; //错误
cout<<grade; //输出grade
cout<<60 ? "fail" : "pass"; //比较cout和60的值,发生错误,小于运算符低于位运算符
位运算符
位运算符如何处理符号位没有明确的规定,所以强烈建议仅将位运算符用于处理无符号数
左移运算符会使变量的类型升级,比如char升级为int,移位运算符右侧的运算对象一定不能为负,而且值必须严格小于结果的位数,否则会出错。
左移运算符在右侧插入值为0的二进制位,右移运算符若对象是无符号类型,则在左侧插入0,若是有符号数,则视情况而定。
移位运算符的优先级比算术运算符的优先级低,但是比关系运算符、赋值运算符和条件运算符高