C++学习笔记(三)

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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值