运算符
1.算术运算符
1.1 bool b=true; bool b2=-b; // 对大多数运算符来说,布尔类型运算对象将提升到整型运算对象,-b=-1,-1为非0,所以转换为true初始化b2.
1.2 溢出和其他算术运算异常
溢出就是该类型计算的结果超出该类型所能表达的范围所致
short short_value=32767; short_value+=1; cout<<short_value; // 计算导致溢出 值将会发生"环绕",-32768,根据编译器的不同,求值结果可能不同。
1.3 取余运算符(%),两边对象必须为整数类型
1.4 整数中,m=m/n*n+m%n; m%(-n)=m%n (-m)%n=-(m%n); 符号和m的符号相同
2.逻辑和关系运算符
2.1 逻辑和关系运算符返回值都为bool类型
2.2 逻辑运算符 && || !
2.3 相等测试
if(val==true){} // 只有当val为1时,条件才为真 如果val不是bool类型,那先将true转换为val类型的1,进行和val比较
进行比较时,直接写if(val)或者if(!val)
2,.4 i != j<k; i!=0或者1 // j<k的返回值要么是0要么是1;
3.赋值运算符
3.1 赋值运算符右侧对象将会转换为左侧对象的类型 int k=3.14;
3.2 赋值运算符满足右结合律,赋值运算符返回左侧对象 ival=jval=0; 先计算jval 返回jval给ival进行赋值
3.3 while ((i=get_Value())!=42){} // 赋值运算符优先级低于关系运算符优先级
4.递增递减运算符
4.1 ++i 作为左值返回和i++原始对象作为右值进行返回
4.2 *pbeg++ // 输出当前值 并将pbeg向前移动一个元素 后置++优先级高于解引用*
4.3 运算对象可按任意顺序求值
大多数运算符没有规定运算对象的求值顺序。如果一个子表达式改变了某个运算对象的值,另一个子表达式又要使用该值的话,运算对象的求值顺序就很关键了。*beg=toupper(*beg++); // 该语句未定义 原因 如果先求左侧的值 *beg=toupper(*beg); 如果先求右侧的值 *(beg+1)= toupper(*beg); // 产生歧义
4.4 简单的if--else可以使用(?:)条件运算符来替代
finalgrade = (grade>90)?"highpass" : (grade>60)?"pass" : "fail"; // 嵌套为了可读性 最好小于或等于两层