一元运算符(作用在一个对象上)和二元运算符(作用在两个对象上)。
左值和右值:当一个对象被用作右值的时候,用的是对象的值(内容),当对象被用作左值的时候用的是对象的身份(地址)。
使用运算符时注意优先级和结合律,括号无视优先级。
int i=1024;
int k=-i;//k=-1024;
bool b=true;
bool b2=-b;//b2==true! 因为b在参与运算时为1,取负值是-1,!=0,所以为true
位运算符:
运算符 | 功能 |
~ | 位求反 |
<< | 左移 |
->> | 右移 |
& | 位与 |
^ | 位异或 |
l | 位或 |
*:位异或:两个运算对象对应位置有且只有一个为1则运算结果中该位为1,否则为0.
使用位运算符,例子:假设班里有三十名学生,老师每周对会对学生测验,测验结果只有通过和不通过两种,为了表示我们就用一个二进制位来表示学生在一次测验中是否通过,
unsigned long quiz=0;//我们有三十个人所以至少得用三十二位
quiz|=1UL<<27;//相当于32位0和第二十七1进行位或
//如果发现这个学生其实没有通过
quiz&=~(1UL<<27);//按位取反然后做位与运算
移位运算符(又叫IO运算符)满足左结合律,<<的优先级比赋值运算符和条件元素运算符等级高,所以使用的时候要注意。
cout<<(10<42);//正确,输入10<42的结果真
cout<<10<42;//错误,试图将cout和42比较
隐式转换发生的情况:
1.大多数表达式中,比int小的整型值首先提升为较大的整数类型。
2.在条件中,非布尔值转换为布尔值
3.初始化过程中,初始值转换为变量的类型;赋值语句中,右侧运算对象转换为左侧运算对象的类型。
4.如果关系运算或算数运算运算对象有多种类型,需要转换为同一种类型。
5.函数调用也会发生类型转换。
显式转换:
命名的强制类型转换:cast_name(experssion)
static_cast是cast_name的一种,只要不包含底层const就可以使用。double slope =static_cast<double>(j)/i;//强制类型转换的浮点去除法
static_cast对于编译器无法执行的类型转换也非常有用,例如我们可以使用static_cast找回存在void*的指针
void*p=&d;
//正确,void可以存任何地址
double *dp= static_cast<double*>(p);//把void*转回初始指针类型
const_cast可以改变底层const;使得常量可以改变。static_cast不行。但是这个有好有坏,本身的常量被改动后可能会导致意想不到的结果。
reinterpret_cast:这个要慎用,改变类型后导致不会报错,但是运行值改变。指向的是同一个地址,但是对地址内东西的诠释却不相同了。
“reinterpret_cast 运算符并不会改变括号中运算对象的值,而是对该对象从位模式上进行重新解释”。数字只是数字,但是字符会进行ASCII翻译。
对于cast_name的解释来源:
语句
空语句:只有一个分号
有的时候语法上要一个句子但是逻辑上不需要,就比如:
while(cin>>s&&s!=sought)
;//空语句,最好把注释写出来,让别人注意到
复合语句:用花括号括起来的,也被称作块,一个块就是一个作用域,比如:
while(val<=10)
{
sum+=val;
++val;
}
:语句 要注意作用域,超出范围就作用不到
:switch中的case关键字要是常量表达式。
跳转语句:
break:负责跳出当前循环。
continue:负责终止当前迭代,并开始下一次迭代。
goto:跳到指定位置,一般不带,理解会比较麻烦。
try语句和异常处理:异常处理机制为程序中异常检测和异常处理这两部分协作提供支持:
throw:异常检测部分使用throw表达式来表示遇到的异常。
try:异常处理部分用try语句块来处理异常,try语句块以关键字try开始,并以一个或多个catch子句结束。try语句块中抛出的异常会被某个catch语句处理。
if(item1.isbn()!=item2.isbn())
throw runtime_error("Data must refer to same ISBN");//如果两个ISBN不一样就抛出runtim_error的异常,终止当前,并抛给能解决的
cout<<item1+item2<<endl;
**标准异常:**exception头文件定义了最通用的异常类exception
exception | 最常见问题 |
runtime_error | 只有运行才检测出的问题 |
range_error | 运行时错误,生成超过有意义的值域范围。 |
overflow_error/underflow_error | 上下溢出 |
logic_error | 逻辑错误 |
domain_error | 参数对应结果值不存在 |
invalid_error | 无效参数 |
length_error | 逻辑错误:试图创造超出该类型最大长度的对象 |
out_of_range | 使用超出有效范围的值 |