增加后置修复操作符不止一个

时间:2014-03-14 22:09:19

标签: c++ c

如何将post-fix运算符增加到超过默认值1?(即将post-fix运算符应用于4以便将值增加到6而不是5)

这个问题与我要创建的for循环有关,我要检查给定字符串的每个第二个数字以进行验证。我认为将i变量递增2而不是1将实现此目的。

4 个答案:

答案 0 :(得分:3)

你不能为内置类型重载++运算符,不能。最简单的方法是使用

var += step;

for(i=0; i<end; i+=4) {
    ...
}

请注意,使用小于而不是相等会导致您不要强调终点不准确排队。当然总有

for(i=0; i<end; ++i) {
    do_something(4*i);
}

其中迭代次数更清晰,如果不是前一次的范围。无论你最清楚什么。

答案 1 :(得分:3)

你可以这样做:

for(int i = 0; i < n; i += x){ /* do something */ }

答案 2 :(得分:1)

我不知道为什么你坚持使用postfix。对于一个简单的for循环,前缀是等价的,所以更喜欢它,因为postfix意味着一个副本。无论如何,除了明显的

for(i=0; i<end; i+=n) ...

如果你只增加2,你也可以说

for(i=0; i<end; ++++i) ...

for(i=0; i<end; ++i, ++i) ...

但哪一个更有效取决于优化器(最有可能它们最终相同)。

答案 3 :(得分:0)

除1之外的步骤没有修复后增量运算符。obj += 2表达式返回新值,而不是旧值。

如果obj是一个类,你可以破解你的+=运算符重载来返回旧值,但这不是一个好主意。

我们可以做的是创建一个名为postinc的简单模板函数,它以类型通用的方式为我们执行此操作:

#include <iostream>

template <typename OBJ, typename DELTA>
OBJ postinc(OBJ &obj, const DELTA &delta)
{
  OBJ oldval = obj;
  obj += delta;
  return oldval;
}

using std::cout;
using std::endl;

int main()
{
  int x = 39;
  int y = postinc(x, 3);  // <-- now we can do this
                          // x and 3 can be any objects supporting x += 3

  cout << "x = " << x << "; y = " << y << endl;
  return 0;
}

输出:

x = 42; y = 39

如您所见,y收到x的旧值,x递增2

我们所做的只是y = postinc(x, 2)。它并不像y += 2的后递增重载那样花哨的语法糖,但是它可以很好地坐在表达式中,消除了引入临时变量的代码的笨拙分解。

如果您不需要后缀语义,甚至根本不需要表达式的结果值,那么只需使用var += delta