C++11(3):表达式

来源:互联网 发布:网络电子游戏网站 编辑:程序博客网 时间:2024/06/02 02:25
函数调用也是一种特殊的运算符
当一个对象被用作右值时,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(内存中的位置)
在需要右值的时候可以用左值来代替,但是不能把右值当成左值。
使用decltype,左值和右值有所不同:如果表达式的求值结果是左值,decltype得到的是一个引用。
int * p;
decltype(*p)    ;// p是int&
decltype(&P)   ; //p是int**
优先级规定了运算对象的组合方式,但是么有说明运算对象按照说明顺序求值。
int i=f1() * f2();
我们知道f1 .   f2 一定会在执行乘法之前被调用,但到底先调用哪个不知道。
对于那些没有指明执行顺序的运算符来说,如果表达式指向并修改了同一对象,就产生未定义的行为。
又如:
int i = 0;
cout<< i << " "<< ++ i <<endl;
不知道是1   1  还是0   1;未定义;
有四种运算符明确规定了求值顺序:
&& 先左,只有当左为真是才继续执行右边的
||
?:
, 从左向右

复合表达式的经验准则:
拿不准的最好用括号规定逻辑
如果改变了某个运算对象的值,在表达式的其他地方不要在使用这个对象
算术运算的对象和求值结果都是右值
算术 表达式未定义的有:数学上未定义的,溢出。
整数除整数还是整数
%取余,取模
c++ 原来规定负值的上向上或向下取整,c++11规定向零取整(直接切除小数)
c++原来规定m%n的符号和n的符号一样,而且商向负无穷一侧取整,
c++11除了-m导致溢出的特殊情况,其他时候(-m)/n和m/(-n)都等于-(m/n),m%(-n)等于m%n,(-m)%n等于-(m%n)

逻辑关系的运算对象和结果都是右值;
声明成引用可以避免对对象的拷贝
*p++等价于*(p++)
cout<<*iter++<<endl;等价于cout<<*iter<<endl; ++iter;
ptr->mem等价于(*ptr).mem

位运算符作用于整数
关于符号位如何处理没有明确的规定,所以强烈建议仅将位运算符用于处理无符号型

sizeof(type)
sizeof expr
返回的是size_t
sizeof运算符的结果部分依赖作用类型:
对char的表达式结果是1
引用时引用对象所占的空间大小
对指针的得到的是指针本身的大小
对解引用的到的是指针所指对象的大小 ,指针不需有效
对数组是真个数组的大小
对string对象或vector对象,只返回该类型固定部分的大小,不会计算对象中的元素占用的空间
可以用数组大小除以数组元素大小来计算数组元素个数

整型提升就是转换成int,否则是unsigned int 
数组一般会转换成指针
当数组被用做decltype , & ,sizeof , typeid上述转换不发生
指向任意非常量的指针能转换成 void*
指向任意对象的指针能装好成 const void*
继承类间还有一种转换方式
允许指向非常量的指针或引用转换成常量
类类型可以定义有编辑器自动执行的转换,但是每次只能执行一种

dynamic_cast支持运行时类型识别
static_cast
const_cast   只能改变运算对象的底层const,去掉const属性
reinterpret_cast  通过为运算对象的位模式提供较低层次上的重新解释,依赖于机器
int*ip;
char *pc = reinterpret_cast<char*> (ip);//从底层进行重新解释
0 0
原创粉丝点击