C++学习笔记(三)

来源:互联网 发布:nginx 代理静态资源 编辑:程序博客网 时间:2024/06/02 19:40

C++学习笔记(三)
本期话题:表达式求值,显示类型转换

1、一元运算符和赋值运算符是右结合的,其它的运算符都是左结合的。所以,a=b=c的意思是a=(b=c),

a+b+c是(a+b)+c

2、左值:左值是引用某个“存储器中的区域”的表达式,一个左值必定能取到它的地址
 [code=c/c++]
 int* p = &++x;  // ok
 int* q = &(x++);  // error: x++不是一个左值,不存在表示x++的地址单元,x++参与

运算时,用x代替x++做运算,表达式完成后再做一个x=x+1
 [/code]

3、求值顺序:
 1)在一个表达式里,子表达式的求值顺序是没有定义的。特别是,你不能假定表达式从左到右

求值。不对表达式的求值顺序加以限制,使得具体实现中有可能生成更好的代码。(注:这就是所谓的编

译器优化)
 例如:
 [code=c/c++]
 int i = 1;
 v[i] = i++;
 [/code]
 这可能求值出v[1] = 1或者v[2] = 1,也可能导致更奇怪的行为(v[2]=2 ???)。
 2)运算符,逗号,逻辑与,逻辑或可以保证位于它们左边的对象一定在右边的对象之前求值。
 [code=c/c++]
 b = (a=2, a+1);  // b最后为3
 [/code]

4、看下面的代码,说明它的功能:
 [code=c/c++]
 void f(char* p, const char* q)
 {
  while (*p++ = *q++);
 }
 [/code]
 功能:以0结尾的字符串的复制。
 [code=c/c++]
 for (;;)
 {
  // some code
 }
 [/code]
 功能:和while(true)一样,无限循环

5、显式类型转换
 1)请尽量避免显式类型转换(也称为强制转换),如使用,请使用C++风格(static_cast,

reinterpret_cast等),不要使用C的转换方式((T)e方式)。
 2)static_cast, reinterpret_cast是编译时的类型转换。前者处理相关类型之间的转换,例如

,一种指针到另一种指针,浮点型到整型;后者处理互不相干的类型直接的转换。
 3)dynamic_cast是运行中检查的转换形式。const_cast可以清除一个常量的const属性。
 4)从e构造出一个类型T的值可以用函数记法T(e)表示:
 [code=c/c++]
 double d = 1.0;
 int i = int(d);
 [/code]
 不幸的是,对于内部类型而言,T(e)等价于(T)e 

原创粉丝点击