【问题标题】:What does assignment operator means in return statements, like return t =...?赋值运算符在 return 语句中是什么意思,比如 return t =...?
【发布时间】:2017-02-20 09:07:10
【问题描述】:

我有一个问题,在我的代码示例中返回赋值表达式是什么意思?我有一个枚举,并且我已经覆盖了 ++:operator。因此,在我的简短示例中,可以在灯之间切换 - 但代码中有一部分我不明白。代码可以编译并正常工作。

代码:

enum Traficlight
{green, yellow, red };

Traficlight& operator++(Traficlight& t)
{
    switch (t)
    {
    case green: return t = Traficlight::yellow; //Here <--
    case yellow: return t = Traficlight::red; //Here <--
    case red: return t = Traficlight::green; //Here <--
    default:
        break;
    }
}

int main()
{


    Traficlight Trafic = Traficlight::green;
    Trafic++;

    if (Trafic == Traficlight::yellow)
    {
        cout << "Light is Yellow" << endl;
    }

    string in;

    cin >> in;

}

“return t = Traficlight::yellow”是什么意思,为什么我不能直接返回 “交通灯::黄色”。

【问题讨论】:

  • 有关赋值运算符的返回值的更多信息,请参见此处:stackoverflow.com/questions/14697643/…
  • t = x; return x;
  • 这段代码无法编译:你定义了前置增量operator++,但是使用了后置增量operator++
  • @MarkRansom 不,模仿内置operator++ 的效果是一种很好的编程习惯,在前缀版本中,它会修改参数并返回其值。
  • @aschepler 刚刚注意到,现在我的评论已被删除。

标签: c++ enums return


【解决方案1】:

在返回指令中,运算符分配给t,这是一个引用(修改它)然后返回值。

这就是自增操作符的作用:同时修改 & 返回引用,以便可以在另一个操作中使用自增值。

【讨论】:

    【解决方案2】:

    t = Traficlight::yellowTraficlight::yellow 写入t。该表达式的结果也是Traficlight::yellow,所以:

    return t = Traficlight::yellow;
    

    等于:

    t = Traficlight::yellow;
    return t;
    

    在上面的函数中,t 的引用被接收为参数,因此更改 t 的值实际上是相关的。

    【讨论】:

      【解决方案3】:

      您的函数通过引用接收参数:

      Traficlight& operator++(Traficlight& t)
      

      而且它是一个 ++ 运算符,所以在语义上它必须递增它的操作数,然后返回对该操作数的引用。所以你必须做两个动作:

      // Assign new value to the t
      t = Traficlight::yellow;
      // Return rusult
      return t;
      

      这可以写成一行,因为赋值运算符返回赋值。

      【讨论】:

        【解决方案4】:

        它将值分配给t 变量(在您的代码中t 是引用类型,因此更改在外部可见),然后返回t 变量的值。

        【讨论】:

          猜你喜欢
          • 2017-01-22
          • 2016-09-08
          • 2018-01-23
          • 1970-01-01
          • 1970-01-01
          • 2017-03-02
          • 2022-01-09
          • 2011-08-22
          • 1970-01-01
          相关资源
          最近更新 更多