C++ primier(第五版)读书笔记 第四章
2018-01-13 09:09
155 查看
C++中的左值与右值
当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。我们可以在需要右值的地方使用左值来代替,但是不能把右值当成左值使用;(int b=a与int 2=b)
使用关键字decltype时,如果表达式求值结果是左值,decltype将得到一个引用类型。假设p的类型是int *,因为解引用运算符生成左值,那么decltype(*p)得到的结果是int&;另一方面,由于取地址运算符生成右值,所以decltype(&p)的结果是int**。
函数优先级问题
f()+g()*f()+h(),这些函数首先要进行求值,这些函数的求值顺序是没有明确规定的,如果这些函数影响同一对象,那么结果将是未定义的。
运算符
除法:如果运算数同号,则取同号,否则异号,结果向0取整。
取余运算:取余运算遵从法则(m/n)*n+m%n==m 这就是说m%(-n)==m%n而(-m)%n==-(m%n)
(当数据量较大时,尝试使用常量引用)
在一条语句中混合使用解引用和递增运算符
前置递增运算符将对象自己作为一个左值返回,后置递增运算符将对象未修改的值作为一个右值返回。
箭头运算符作用于一个指针类型的运算对象,结果是一个左值;点运算符所属的对象如果是右值,则返回右值,如果是左值,则返回左值。
由于解引用运算符的级别低于点运算符,因而
是正确的,因为箭头的优先级高于++.
移位运算符(IO运算符)满足左结合律,故cout << "aa" << "bb" << endl;
((cout << "hi") << "bb") << endl;这两个语句是等效的。
对数组执行sizeof得到整个数组所占空间的大小//对指针执行sizeof得到指针所占空间大小//对string或vector实行sizeof只返回该类型固定部分的大小。
string a = "aaaa";
string b = "b";
cout << sizeof(a) << sizeof(b) << sizeof(string);
//输出结果全部为24
如果逗号右侧的运算对象是左值,那么逗号表达式最后求职结果也是左值。
cast-name<type>(expression)
static-cast:任何具有明确定义的类型转换,只要不包含底层ocnst,都可以使用static-cast
当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。我们可以在需要右值的地方使用左值来代替,但是不能把右值当成左值使用;(int b=a与int 2=b)
使用关键字decltype时,如果表达式求值结果是左值,decltype将得到一个引用类型。假设p的类型是int *,因为解引用运算符生成左值,那么decltype(*p)得到的结果是int&;另一方面,由于取地址运算符生成右值,所以decltype(&p)的结果是int**。
函数优先级问题
f()+g()*f()+h(),这些函数首先要进行求值,这些函数的求值顺序是没有明确规定的,如果这些函数影响同一对象,那么结果将是未定义的。
运算符
除法:如果运算数同号,则取同号,否则异号,结果向0取整。
取余运算:取余运算遵从法则(m/n)*n+m%n==m 这就是说m%(-n)==m%n而(-m)%n==-(m%n)
(当数据量较大时,尝试使用常量引用)
在一条语句中混合使用解引用和递增运算符
auto pbeg=b.begin(); //输出元素直到遇到第一个负值为止 while(pbeg!=v.end()&&*pbeg>=0) cout<<*pbeg++<<endl;后置运算符的优先级高于解引用运算符。
前置递增运算符将对象自己作为一个左值返回,后置递增运算符将对象未修改的值作为一个右值返回。
箭头运算符作用于一个指针类型的运算对象,结果是一个左值;点运算符所属的对象如果是右值,则返回右值,如果是左值,则返回左值。
由于解引用运算符的级别低于点运算符,因而
*p.size();这种写法一定是错误的。而
iter++->size()
是正确的,因为箭头的优先级高于++.
移位运算符(IO运算符)满足左结合律,故cout << "aa" << "bb" << endl;
((cout << "hi") << "bb") << endl;这两个语句是等效的。
cout << 10 < 42; //现在用移位的思想来看这个语句, //就是把数字10写到cout中,然后用cout与42进行比较 //当然这是illegal }Sizeof
对数组执行sizeof得到整个数组所占空间的大小//对指针执行sizeof得到指针所占空间大小//对string或vector实行sizeof只返回该类型固定部分的大小。
string a = "aaaa";
string b = "b";
cout << sizeof(a) << sizeof(b) << sizeof(string);
//输出结果全部为24
如果逗号右侧的运算对象是左值,那么逗号表达式最后求职结果也是左值。
类型转换
类型转换的形式为:cast-name<type>(expression)
static-cast:任何具有明确定义的类型转换,只要不包含底层ocnst,都可以使用static-cast
int i = 5, j = 2; double slope = static_cast<double>(i) / j; cout << slope << endl;
double val = 1.3; void *p = &val; double *dp = static_cast<double*>(p);const-cast只能改变运算对象的底层const,他将会去掉某个对象的const属性。
const char *pc; char *p = const_cast<char*>(pc); //通过p写入值是一个未定义的行为 const char *cp; char *q = static_cast<char*>(cp); //static-cast不能去掉const static_cast<string>(cp);//正确 const_cast<string>(cp); //const-cast不能改变对量类型reinterpret-cast实现的类型转换模式为:它会产生一个新的值,这个值会有与原始参数(expressoin)有完全相同的比特位。
int i = 30; int *pi = &i; char *cp = reinterpret_cast<char*>(pi); cout << *cp << endl; //输出一个非法字符在上面的例子之中,cp会认为它指向了一个char,但是实际上它指向的是一个int,当输出时自然会遇到错误。
相关文章推荐
- Programming Windows 第五版读书笔记 第四章 输出文字
- Perl语言入门(第五版) 读书笔记(八)---字符串与排序
- Linux内核分析第四章读书笔记
- 第四章读书笔记 进程调度
- 《C++ Primer》第五版课后习题解答_第四章(1)(01-20)
- 【读书笔记】第四章 瞬时响应:网站的高性能架构
- 读书笔记-->第四章 交付用户想要的软件 -->《高效程序员的45个习惯》
- 读书笔记-第四章
- 高级编程第五版读书笔记
- 《Corba原理及应用》第四章 读书笔记之Orbix 编译demos
- 【读书笔记】《深入浅出nodejs》第四章 异步编程
- 《Android群英传》读书笔记 (2) 第三章 控件架构与自定义控件详解 + 第四章 ListView使用技巧 + 第五章 Scroll分析
- 《统计学习方法》 第四章 读书笔记
- [李景山php] 深入理解PHP内核[读书笔记]--第四章:函数的实现 --简介
- C++Primer第五版 第四章习题答案(1~10)
- STL源码剖析_读书笔记:第四章 序列式容器 list篇
- 读书笔记:持续集成软件质量改进和风险降低之道-第三章 和第四章
- Perl语言入门(第五版) 读书笔记(一)---列表、数组、子程序
- C Primer Plus (第五版) 第四章 编程练习
- 计算机网络(第五版 作者:AndrewS.Tanenbaum David J.Wetherall 清华大学出版社)读书笔记----第三、四章的学习