c++ 关于自增与解引用的问题
while(cin>>i)ivec.push_back(i);if(ivec.size()==0){cout<<"Nonumbers"<<endl;return-1;}f...
while(cin>>i)
ivec.push_back(i);
if(ivec.size()==0){
cout<<"No numbers"<<endl;
return -1;
}
for(iter=ivec.begin();iter<ivec.end()-1;iter=iter+2)
cout<<*iter+*(iter+1)<<" "; \\ 这里把改成*(++iter)便得不到正确结果 为什么呢?
按我的理解,(++iter)和(iter+1)不是一样的嘛? 同样都是是迭代器指向下一个元素然后再解引用,为什么用自增就得不到正确结果?? 展开
ivec.push_back(i);
if(ivec.size()==0){
cout<<"No numbers"<<endl;
return -1;
}
for(iter=ivec.begin();iter<ivec.end()-1;iter=iter+2)
cout<<*iter+*(iter+1)<<" "; \\ 这里把改成*(++iter)便得不到正确结果 为什么呢?
按我的理解,(++iter)和(iter+1)不是一样的嘛? 同样都是是迭代器指向下一个元素然后再解引用,为什么用自增就得不到正确结果?? 展开
3个回答
展开全部
这个(iter+1)比较明确,就不需要解释了。至于(++iter)呢,其实效果就是iter先加+再运算,也是没有错。但是问题就在于你是cout<<*iter+*(iter+1)<<" ";l了,我用的是vc6.0,这个编译器输入输出是采用的压栈式,那么在代码执行的时候由于压栈的原因会先计算(++iter)然后再计算iter(可以简单的理解为计算方向是与代码相反的方向),也就是说现在的iter都已经指向了下一个元素,就是你的这个加法其实就是加的两个iter指向的下一个元素。不同编译器有不同的解释,具体看情况。建议你可以用简单的前置++后置++还有混合括号的形式具体测试一下编译器的情况。
希望有帮助。
希望有帮助。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看如下.
int N = 1;
int X = (N+1); // X等于2吧?, N等于1.
再看.
int N = 1;
int X = (++N); // X同样等于2, 但是N也变成了2.
N+1 和 ++N的返回值一样, 都是2, 但是前者不改变自身而后者改变自身.
*iter+*(iter+1) // 这里你期望的是iter的值加上iter下一个值. 计算之后iter依然指向第一个值的位置
*iter+*(++iter) // 这里结果输出一样, 但是iter被向前推进了1位, 加上循环末的iter = iter+2
// 一次循环iter就被推进3个位置.
int N = 1;
int X = (N+1); // X等于2吧?, N等于1.
再看.
int N = 1;
int X = (++N); // X同样等于2, 但是N也变成了2.
N+1 和 ++N的返回值一样, 都是2, 但是前者不改变自身而后者改变自身.
*iter+*(iter+1) // 这里你期望的是iter的值加上iter下一个值. 计算之后iter依然指向第一个值的位置
*iter+*(++iter) // 这里结果输出一样, 但是iter被向前推进了1位, 加上循环末的iter = iter+2
// 一次循环iter就被推进3个位置.
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
完全不一样好吧,一个是先加再用。另一个是先用再加
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询