递增运算符(++)和递减运算符(–)辨析
在学习C++过程中免不了接触这种递增方式,,除了一些常规的自增运算外,由于很多迭代器本身不支持算数运算,这时候就需要用到递增和递减运算符,所以递增和递减这时不仅仅是计算起来简洁,更多的是必须的。
前置版本:++i和–i
这种形式的运算符首先将运算对象加1或减1,然后将改变后的对象作为求值结果。
后置版本:i++和i–
这种形式的运算符会将运算对象加1或减1,但是求值结果是运算对象改变之前的那个值的副本。
辨析
int i=0,j;
j=++i;//j=1,i=1
j=i++;//j=1,i=2
这两种运算符必须作用于左值运算对象,前置版本将对象本身作为左值返回,后置版本将对象原始值的副本作为右值返回。
建议:除非必须,否则不用递增或递减的后置版本
原因其实很简单,后置会在赋值的时候创建一个副本用于保存递增或递减之前的值,如果我们不需要修改之前的值,那这是一种不必要的资源浪费,一个牛逼的程序员必须要是简洁高效为主。
如果一条表达式,既想得到递增前的值,又要递增后的值,那就使用后置版本。举个栗子:
auto pbeg=v.begin();//这个例子是一个输出vector内元素,直到遇到负数停止
while(pbeg!=v.end()&&*pbeg>=0){
cout<<*pbeg++<<endl;//输出当前值,并将pbeg向前移动一个元素
}
后置运算符的优先级是高于解引用运算符的,因此* pbeg++等价于 *(pbeg++),pbeg++把pbeg加1,然后返回pbeg的初始值的副本作为其求值的结果,此时解引用运算符的运算对象是pbeg未增加之前的值。
总结一下就是后置版本返回初始的未增减的版本:
把上面那段代码写一个等价的版本如下:
cout<<*pbeg<<endl;
++pbeg;//或者pbeg=pbeg+1
使用条件运算符从vector< int >中找到奇数然后输出奇数值翻倍后的结果
#include<vector>
#include<iostream>
using namespace std;
int main(){
vector<int> allval;
int num;
while (cin>>num)
{
allval.push_back(num);
}
for (decltype(allval.size()) i = 0; i < allval.size(); ++i)
{
(allval[i]%2==0)?allval[i] : allval[i]*=2;
}
for (decltype(allval.size()) j = 0; j < allval.size(); ++j)
{
cout<<allval[j]<<" ";
}
cout<<endl;
}
代码敲完了才发现自己有点蠢,为什么就不把cout写到第一个for里面呢,今天被阿根廷搞得太扎心了,在这也简单记录一句吧,居然能输也是真的离谱,太失望了,内心和退钱哥有的一拼。