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
- Object C NSArray (学习笔记三)
- 《C和指针》学习笔记(三)
- c++primer学习笔记(三)
- c++Templates学习笔记(三)
- [C++]C++学习笔记(三)
- C语言程序学习(三)笔记
- 《Effective C++》学习笔记(三)
- C/C++学习笔记(三)
- Objective-c 学习笔记(三)
- C语言学习笔记(三)
- 学习C的一些笔记(三)
- C/C++学习笔记三(函数)
- 《effective c++》学习笔记(三)
- c语言学习笔记三
- C语言学习笔记<三 >
- C/C++学习笔记(三)
- C++Primer学习笔记《三》
- Objective C学习笔记(三)
- INF文件格式
- PROJECT第一天
- Spring事务处理
- 双机热备、双机互备和双机双工,这三者之间的区别
- trace配置文件
- C++学习笔记(三)
- AOP应用实例--Spring事务处理及其AOP框架的内幕
- 互联网创业的五大定律
- 让Spring架构减化事务配置
- 重新做回自己
- 2007 12.4 晴
- SQL Server 中简体繁体数据混用的问题
- ajax--处理XML文档的DOM元素属性
- 如何使用 ASP.NET、ADO.NET 和 Visual C# .NET 查询和显示 Excel 数据