C++ Primer阅读笔记(5)

第五章 表达式

Posted by SixTeen on May 4, 2016

第五章 表达式

1.表达式由一个或多个操作数通过操作符组合而成。

2.作用在一个操作数上的操作符成为一元操作符,如取地址操作符和解引用操作符,而二元操作符则作用于两个操作数上,如加法操作符和减法操作符。三元操作符则作用在三个操作数上。

3.对负数求模的结果不可预估

4.逻辑与(&&)和逻辑或(||)操作符总是先计算其左操作数。只有仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解其右操作数。我们常常称这种求值策略为”短路求值”。

5.~位求反,«左移,»右移,&位与,^位异或,|位或.

6.位操作符,由于系统不能确保如何处理其操作数的符号位,所以强烈建议使用unsigned整数操作数。

7.赋值操作具有右结合性。

int ival;int* pval;
ival = pval = 0;//error,不能将指针赋给整形

8.

int i = 0, j;
j = ++i;//j=1,i=1
j = i++;//j=1,i=2

9.条件操作符的优先度很低。

cout << (i>j?i:j);//print i or j
cout << (i>j)?i:j;//print 1 or 0
cout << i>j?i:j;//error,compares cout to int

10.sizeof返回一个对象或类型名的长度,返回值为size_t

对char类型sizeof操作保证得1

对引用类型做sizeof将返回存放此引用类型对象所需要得内存空间大小

对指针做sizeof返回存放指针所需要的内存大小。

对数组做sizeof操作等效于对其元素做sizeof操作的结果乘上数组元素的个数。

11.逗号操作符:表达式从左向右计算,逗号表达式的结果是其最右边表达式的值。

12.优先级:

::

. -> [] ()函数调用,类型构造

后++ 后– typeid() 强制类型转换

sizeof() 前++ 前– ~ ! - + * & ()类型转换 new delete delete[]

->* .* 指向成员操作的指针

* / %

+ -

« »

< <= > >=

== !=

&

|

&&

||

?:

= *=,/=,%= +=,-=,«=,»=,&=,|=,^=

throw

,

13.尽管现代机器的内存容量越来越大,但是自由存储区总有可能被耗尽,如果程序用完了所有可用的内存,new表达式就有可能失败,如果new表达式无法获取需要的内存空间,系统将抛出名为bad_alloc的异常。

14.如果指针指向不是用new分配的内存地址,则在该指针上使用delete是不合法的。

15.如果指针的值为0,对其做delete是合法的,但这样做没有意义。C++保证删除0值指针是安全的。

16.在delete后,p变成没有定义(指向被释放的内存),变成了悬垂指针。悬垂指针指向曾经存放对象的内存,但对象已经不存在了。悬垂指针往往导致程序错误,而且很难检测。

17.一旦删除了指针所指向的对象,立即将指针置为0,这样就非常清楚的表明指针不再指向任何对象。

18.删除动态分配内存失败称为”内存泄露”。

19.读写已删除的对象和对同一个内存空间使用两次delete表达式都会造成错误。

20.隐式类型转换(由编译器自动执行)

21.算术转换定义了一个类型转换层次,改层次规定了操作数应按什么次序转换成表达式中最宽的类型。在包含多种类型的表达式中,转换规则要确保计算值的精度。

22.无符号的转换依赖于机器。

23.指向任意数据类型的指针都可以转换为void*类型,整型数值常量0可转换为任意指针类型。

24.将istream类型转换成bool类型意味着要检验流的状态。如果最后一次读cin的尝试是成功的,则流的状态将导致类型装换为 bool类型后获得true值。

25.显式转换static_cast,dynamic_cast,const_cast,reinterpret_cast,格式为cast-name<type>(expression)

26.const_cast只能用于添加或者删除const特性。

int main() {
    const int i = 100;
    int* j = const_cast<int*>(&i);
    (*j)++;
    cout << &i << " " << i << endl;
    cout <<  j << " " << (*j) << endl;
    return 0;
}
//output
/*
* 0018FC18 100
* 0018FC18 101
*/

27.编译器隐式执行的任何类型转换都可以由static_cast显式完成。

int main() {
    double d = 3.14;
    void* v_ptr = &d;
    double* d_ptr = static_cast<double*>(v_ptr);
    cout << (*d_ptr) << endl;
    return 0;
}

28.旧类型转换。 (type) expr type (expr)

1
FIN 5.12/9.22