c++ - 了解运营商

标签 c++ operators

我们的教授给了我们一个练习测试和答案,以帮助我们进行即将到来的测试。我不明白这段代码的答案是 135

我明白类是什么,但我对运算符的工作方式感到困惑。对于 v{6},我理解对于对象 vint v 等于 13。我认为在 int main 中, (-v - v).print 中的第一个 -v 将首先在返回 2 * v 的运算符中进行评估 并且它将返回 26。然后我想他们会被放在最后一个运算符中

V operator-(int lop, const V& rop)
{
    return rop - lop;
}

但我认为情况并非如此。我已将此代码放入 Visual Studio 中进行处理,但我不明白发生了什么。

#include <iostream>
using namespace std;

class V
{
    int v;

public:
    V(int a = 3, int b = 7) : v{a + b}
    {
    }

    void print()
    {
        cout << v;
    }

    V operator-(const V& rop) const
    {
        return (3 * v) + (2 * rop.v) + 3;
    }

    V operator-()
    {
        return 2 * v;
    }
};

V operator-(int lop, const V& rop)
{
    return rop - lop;
}

int main() 
{
    V v{6};
    (-v - v).print();

    return 0;  
}

最佳答案

哇,这是令人困惑的代码,有重复使用的变量名、奇怪的非常规操作等等。代码特别难理解,因为 V可以从一个整数隐式构造,并且总是将 7 添加到该整数;即使使用调试器,我也花了一些时间才理解。请永远不要写这样的代码,即使是为了好玩!

-v 的结果在main不是 int .这是一个V从表达式 2 * v 隐式构造的对象(=26),得到一个值为 33 (26+7) 的成员整数。

就好像你写的一样:

V operator-()
{
    return V(2 * v);
}

或者,由于默认参数:

V operator-()
{
    return V(2 * v, 7);
}

然后你把这个新返回的对象提供给成员 operator-(const V&) ;同样的故事也适用。它产生表达式 3*33 + 2*13 + 3 , 即 128;这再次用于构建一个新的 V (因为这是返回类型!),所以加 7 得到 135。

operator-(int lop, const V& rop)不会进入它,因为你从未在 int 之间执行减法和一个 V .

关于c++ - 了解运营商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56058075/

相关文章:

c++ - 方便的 Vector3f 类

c++ - 类型推导 lambda 引用资料

python - 比较 Python、Numpy、Numba 和 C++ 的矩阵乘法

c# - 如何在 C# 中计算整数的除法和模数?

java - 前缀和后缀运算符java

c++ - 简单的继承问题

c++ - C++ 17的新功能是什么?

python - 在命令行上打印 python 模数运算符

c - 运算符优先级背后的逻辑

powershell - "::"有什么作用?如何在 powershell 脚本中使用 "::"?