【问题标题】:Is there an increment operator without assignment?是否有没有赋值的增量运算符?
【发布时间】:2016-03-14 21:20:04
【问题描述】:

这确实是一个 C++ 语言问题。我很想知道是否存在这样的运营商,或者正在开发,或者已经弃用。

我想知道是否有一种方法可以使用增量运算符而不改变它的值

我知道++var 就赋值而言等同于var += 1,并且表达式将计算为var + 1(如果它是前缀)。

这可能很无聊,但是当我有条件时

if (var + 1 == SOME_CONST) {}

我想写得更像

if (++var == SOME_CONST) {} //not what I want

但不改变 var 的值:

int varDummy = var;
if (++varDummy == SOME_CONST) {}

// Now I want (varDummy == var) to evaluate true, so I wouldn't need varDummy

这种行为可能吗?当然这不是必需的,但是当我不得不使用数字文字时,我会感到畏缩。而且我不希望运算符重载,因为在其他情况下,我希望递增/递减运算符表现正常......

【问题讨论】:

  • 为什么要改变这个?为什么var + 1 不够用?
  • @Tim 完全够用了。当赋值无关紧要时,我只是习惯于使用带有局部变量的增量运算符。我试图找出的只是 c++ 中是否存在这种行为。
  • 我想知道,为什么不使用if (++var == SOME_CONST) 而不是只使用if (var == SOME_OTHER_CONST) where SOME_OTHER_CONST=SOME_CONST+1
  • @Aposhian 好吧,我也喜欢避免使用常量。但这真的取决于上下文。 1 通常是 whole100% 的表示形式,我认为这是适合使用的。如果你能澄清上下文,也许我们可以帮助你想一个替代方案。

标签: c++ increment decrement


【解决方案1】:

不,这在语言中不存在。为此使用+ 1 是惯用的。有时,数字文字是合适的:)

【讨论】:

  • 该语言允许重载运算符,当然可以重载增量运算符,这样它就不会修改操作数。
  • 是的,您当然可以使用运算符重载来构建它,这违反了 OP 要求。但它仍然不是惯用的,并且在语言规范中仍然不存在:)
【解决方案2】:

如果你愿意,你可以这样做。例如

inline int inc(int i) { return i+1; }

如果您重视简洁,请使用简洁的函数名称,例如 inc;如果您重视清晰,请使用类似 one_more_than 的名称。

【讨论】:

  • 虽然我希望这会增加输入值 - 这是它在汇编程序和一些 Pascal 风格中所做的事情。
【解决方案3】:

如果您不想使用数字文字,您可以像定义 SOME_CONST 一样定义“1”:

#define ADDITIONAL 1

// somewhere else...
if (var + ADDITIONAL == SOME_CONST) {}

或者,甚至更好:

#define THE_REAL_CONST_YOU_NEED (SOME_CONST - 1)

【讨论】:

  • 这可能是固执己见,但我绝对讨厌这种令人困惑的代码风格,好吧,也许你的回答不应该太认真:)
  • @FrankPuffer - 如果有的话,问题中的原始要求值得憎恨。使用明确定义的运算符来反对它的定义是很糟糕的,并且不做一些明显和普遍存在的事情(只是+1)也好不到哪里去 - 但是如果 OP 有一些合理的借口(没有与我们分享)想要那个,使用宏是一种方法。具体方法不太重要,甚至可以做一个加1的宏函数(类似于你的答案,就像一个宏......)。
【解决方案4】:

如果你绝对不喜欢+1,你可以定义一个增量函数:

T inc(T var) {
    return var++;
}

(我使用 T 作为定义了增量运算符的类型的占位符。我假设您的 var 不一定是 int。)

然后:

if (inc(var) == SOME_CONST) {}

【讨论】:

  • 不妨一路走下去,在开头打上template<typename T>,把它变成一个模板
【解决方案5】:

看起来不错:

if ( (++var)-- == SOME_CONST) {}

【讨论】:

  • 当然看起来不错,但他正在寻找一个 没有 分配的运算符,而您推荐一个有 两个 的运算符 :)
  • 显然他所要求的只是外观。这不是一个真正合乎逻辑的问题,他提到了这一点。他只是不喜欢 + 1
猜你喜欢
  • 2023-03-20
  • 2016-09-28
  • 2016-11-02
  • 2014-08-25
  • 2011-09-14
  • 2013-08-04
  • 1970-01-01
  • 2015-12-14
相关资源
最近更新 更多