您的位置:首页 > 编程语言 > C语言/C++

c++ 学习 随笔三

2014-11-21 09:42 232 查看
1、对于操作符大家应该都比较熟悉,算数操作符+,-,*,/,%;逻辑操作符&&,||,~;对于我而言,这些运算符都是经常用,但是也有一点小问题,就是对于/和%,一个除法,一个取模;这两个操作符均为二元操作符,所以需要两个操作数。这样而言,对于这两个数均为正或者均为负的情况倒好说,但是如果为一正一负的话,这种情况就要看机器了,具体的情况可以查阅相关资料,我就不详述了。

2、对于二元运算符或者三元运算符而言,总是有不只一个操作数,那么非常明显,这个操作数自然也可以由算数表达式而言;那么问题来了,这些算数表达式的运算有先后顺序吗?!对于逻辑与&&和逻辑||而言,总是先计算左操作数,如果左操作数不能确定整个表达式的符号的话,再计算右操作数。这也被称为短路求值!那么对于+而言,先计算左操作数还是先计算右操作数则是没有定论的,随机而定;所以,在这种情况下,如果左右两个操作数均对同一个对象进行操作,但是又不知两个操作数的执行先后顺序,很显然这种 表达就是错误的,所以切记不能犯这样的错误!

3、对于位操作符而言,由于系统不能确切的处理符号位的方式,所以最好使用unsigned整型操作数。

4、unsigned和signed型数据,我们称为无符号和有符号两种数据类型,对于无符号类型,计算机默认所有的位均表示数值,对于8位unsigned整型可表示数值范围是0-255;

对于signed有符号类型数据,则依据编译器的不同来看待不同的符号位方式,常见的为首位为符号位,1为负,0为正,因此8位signed整型可表示的范围为-127到127;有的为-128到127.

5、赋值操作几乎在每一个程序当中都会用到,而且还会用到很多次。而所赋的值要根据对象的类型来设定,那么问题来了?如果所赋的值超过了类型的表达范围怎么办?这个就要根据类型是unsigned还是signed来分情况处理了。对于unsigned类型而言,如果所赋的值超过了最大的表示范围,例如,8位最大值为255,结果我们却赋值257,那么计算机会自动用所赋的值对取值范围进行取模,余数即为真正的值,在这里也就是257%256,因为0-255的取值范围是256;那么unsigned本身并不表示负值,在c++中将负值赋值给unsigned类型却合法,因为它会进行取模操作,这样一定会取到合理的范围操作。对于signed而言,这就要看编译器的处理,有些是对取值范围进行取模处理,有些则不一定。

6、sizeof(),这个运算符依据()内的变量类型不同而有不同的含义,一个表示类型的长度,一个表示对象的长度,sizeof(char),那么答案一定是1;如果对数组进行sizeof()操作,那么得到的是数组中所有元素所占的位置大小,如果想求得数组中的元素个数,这要再除以sizeof(数组中元素的类型)。

7、下面再写一个有趣的表达式

int *p = new int;
int *p = new int();
这两个式子,其实区别就在于第二个进行了初始化,第一个没有进行初始化。值的初始化()要放在类型后面,而不是变量后面。在我们要养成初始化的好习惯,对于没有初始化的式子的使用是非常可怕的,可能引起灾难性的后果。

8、由于之前就提到过new 和delete的关系,所以这里就大致讲一些要点。首先delete只能删除动态创建的内存,如果delete删除动态内存失败就是典型的“内存泄露问题”;除此之外不能连续删除同一指针两次;不能对已删除的指针进行读写操作;这些操作都会引起灾难性的后果。还有一个概念叫悬挂指针,也就是当delete掉指针后,指针没有指向了,这时称为悬挂指针,悬挂指针的存在对程序是非常可怕的,它所引起的错误是非常难查找的,所以在删除一个指针后我们应立即将其至为0;

9、对于强制类型转换,c++提供了四种方法,static_cast,dynamic_cast,const_cast,reinterpret_cast;其中的reinterpret_cast就像旧风格的强制类型转换,const_cast是去掉const性质的;dynamic_cast会单开一个专题,这个比较重要,还有static_cast提供简单的类型转换。其实非常不建议用强制类型转换,如果出错了很难查找。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: