赋值运算符:
赋值运算符的左侧对象必须是一个可修改的左值。相应的,结果的类型就是左侧运算对象的类型。如果复制运算符的左右两个运算对象类型不同,则右侧运算对象将转换成左侧运算对象的类型。
允许使用花括号括起来的初始值列表作为赋值语句的右侧运算对象:
k = {1};
无论左侧运算对象的类型是什么,初始值列表都可以为空。此时,编译器创建一个值初始化的临时量并将其赋给左侧运算对象。
赋值运算符满足右结合律:
int i,*p;
i = p=0; // 错误:不能把指针的值赋给int
所以是从右到左依次赋值.
赋值语句经常出现在条件中,因为赋值运算的优先级相对较低,所以通常需要给赋值部分加上括号使其符合我们的原意。
复合赋值运算符,如+=
和普通赋值运算符的区别是左侧运算对象的求值次数:使用复合运算符只求值一次,使用普通的运算符则求值两次。
递增和递减运算符
递增运算符(++)和递减运算符(--):为对象加1和减1的操作。
递增和递减运算符有两种形式:前置版本和后置版本。
前置版本:首先将运算对象加1(或减1),然后将改变后的对象作为求值结果。(将对象本身作为左值返回)
后置版本:将运算对象加1(或减1),然后将运算对象改变之前的那个值的副本作为求值结果。(将对象原始值的副本作为右值返回)
如:
int i=0,j;
j=++i; //j=1 i=1
j=i++; //j=1 i=2
混用解引用和递增运算符:
auto pbeg =v.begin();
while(pbeg!=v.end() && *pbeg>=0){
cout<<*pbeg++<<endl; //输出当前值并将pbeg向前移动一个元素
}
后置递增运算符的优先级高于解引用运算符,因此*pbeg++等价于*(pbeg++)。