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

C++ primer第二次阅读学习笔记(第5章)

2012-05-16 20:30 232 查看

第五章

对于两个数的除法和求模,若均为正,则结果均为正。若均为负,除法结果为正,取模的结果为负。若一正一负,则结果依赖于具体编译器。
之所以不能串联使用关系操作符如if(i<j<k),因为关系操作符具有左结合特性。i<j首先比较,比较的结果为0或1,然后在与k进行比较,只要k>=1,结果恒为真。
对于判断与bool值相等与否,一般都是判断非假,if(val!=false),或是写成if(val),因为val可能是int或是相关类型,如果使用if(val==true),此时只有当val==1时才成立,而对于int类型来说非零即为真,0为假。
前置自增自减运算符效率较后置自增自减运算符较高。因为前置运算符只需加一或减一后返回结果,而后置运算符必须先保存原来的值,再加一或减一。
对于cout<<*iter++,很容易让人疑惑。它等同于*(iter++),因为自增运算符优先级高于解引用操作,且它们都是从右向左结合。此句也相当于cout<<*iter;iter++;因为iter++自增后,返回原值的副本,然后在解引用此值。
条件操作符的优先级相当低,应该注意使用括号。如cout<<(i<j?i:j);如果写成cout<<i<j?i:j;它将i和j的值相比较后的值视为cout的操作数,输出0或1,<<操作符返回cout值,然后将返回结果作为条件操作符的判断条件。
对于内置的类型,动态申请空间如int*p=new int:与int*p=new int(),有显著的差别,第一种情况int变量没有被初始化,第二种被初始化为0。对于类类型,第一种写法与第二种写法没有显著差别,类的默认构造函数都会被调用。
堆空间可能会被耗尽,因此动态申请内存可能会失败。动态内存交换并不能保证堆空间随用随有。
delete动态申请的空间之后要将指针置为NULL,否则将变成野指针。有可能被误用。两次对同一块堆空间调用delete可能会导致堆空间被破坏。
const_cast用于去掉表达式const性质。如const char *ptr;char *p=const_cast<char*>(ptr);去除了ptr的const属性。
static_cast,编译器隐式执行的任何类型转换都可以由static_cast显式完成。用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。把空指针转换成目标类型的空指针。把任何类型的表达式转换成void类型。
旧式的强制转换符号有两种形式,如int(ptr),或(int)ptr;但这是c语言的强制类型转换,虽然C++支持,但是推荐使用C++中的强转操作符。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: