代码要明意
养成良好的编程习惯
条件运算符(? :)可镶套使用
eg:final_grade = (grade > 90) ? “A” : (grade > 60) ? “B” : “C”;
条件表达式的优先级非常低,一般在一条长表达式中嵌套使用条件表运算子表达式时,通常需要在它两端加上括号。
位运算
关于符号位处理:
没有明确的规定,依赖于机器,建议用位运算处理无符号型。
sizeof
两种形式:
sizeof(type)
sizeof expr
逗号运算符
逗号运算符含有两个运算对象,按照从左向右的顺序依次求值。
对于逗号运算符来说,首先对左侧的表达式求值,然后将求值结果丢弃掉。逗号运算符真正的结果是右侧表达式的值。如果右侧表达式的值是左值,那么最终的求值结果也是左值。
逗号运算符长用在for循环中:
vector<int>:: size_type cnt = ivec.size();
//将从size到1的值赋值给ivec的元素
for(vector<int>:: size_type ix = 0;ix != ivec.size();++ix,--cnt)
ivec[ix] = cnt;
类型转换
隐式类型转换:
- 在大多数表达式中,比int类型小的整型值首先提升为较大的整数类型(整型提升)
- 在条件中,非布尔型转换为布尔型
- 初始化的过程中,初始值转换成变量的类型;在赋值语句中,右侧运算的对象转换成左侧运算对象的类型
- 如果算术运算或者关系运算的运算对象有多种类型,需要转换成同一种类型
- 函数调用时发生类型转换
算术转换:
运算符的运算对象将转换为最宽的类型。
当表达式中既有整型又有浮点型时,整数值将转换为相应的浮点型。
数组转换成指针:在大多数用到的数组的表达式中数组自动转换成指向数组首元素的指针
指针的转换:
指向任意类型的非常量指针均可转换成void指针
指向任意对象的指针均可转换成const void
类类型定义的转换:
类类型能定义由编译器自动执行的转换,不过编译器每次只能执行一种类类型的转换。
eg:
striing s, t = “a example”;//字符串字面值转换成string类型
while(cin >> s)//cin转换为布尔型
强制类型转换
(尽量避免使用强制类型转换)
cast-name(expression);
cast-name : static_cast, dynamic_cast, const_cast, reinterpret_cast
static_cast
任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。
double slope = static_cast(i) / j ;
当需要把一个较大的算术类型赋值给较小的算术类型时,static_cast非常有用。
const_cast
改变运算对象的底层const
const_cast常用与有函数重载的上下文中。