替代=符号

时间:2012-03-15 00:45:09

标签: c++ equals

我被要求实现一个c ++代码来执行赋值x = y而没有=符号和没有函数。我使用了memcpy:

int main(int argc, char *argv[])
{
    int x(5),y(3);
    memcpy(&x,&y,sizeof(y));
    printf("%d",x);
    getchar();
    return 0;
}

任何其他通用解决方案?

谢谢

5 个答案:

答案 0 :(得分:11)

如果假设xy为int:

while (x < y) {
    ++x;
}
while (y < x) {
    --x;
}

答案 1 :(得分:4)

我不确定(5)(3)表示什么是C人,但如果他们只是整数那么怎么样:

x |= y; // all bits set in y now definitely set in x
x &= y; // all bits not set in y now definitely not set in x

或者,根据Oli Charlesworth在下面的评论,如果你不想要=符号那么:

x or_eq y; // all bits set in y now definitely set in x
x and_eq y; // all bits not set in y now definitely not set in x

答案 2 :(得分:1)

以下在任何真实环境中都不是非常有用,但它至少可以解决问题&#34;根据其规则:

int main(int argc, char* argv[])
{
    int y(5);
    int x(y);

    std::cout << x << " " << y << std::endl;

    return 0;
}

答案 3 :(得分:0)

警告:这变得丑陋......坚定地在脆弱的hackery的土地上;-P。

任意类型的赋值有时必须调用一个函数 - 无论是赋值运算符还是[copy]构造函数。放置new是一个运算符 - 而不是函数调用 - 尽管它可能需要将参数传递给构造函数。要一般地重建一个对象,你需要知道它是事先被破坏的,它需要一个函数调用但不需要赋值 - 所以是否允许? :-)无论如何,如果重建可以抛出,那个想法仍然会被破坏,因为析构函数可以在已经被破坏的对象上第二次被调用。在实践中,您可以编写析构函数以使其安全(例如delete之后的NULL指针),或构造函数不抛出,但它是未定义的行为而不是真正的通用(您可能期望的各种复杂情况:虚拟调度指针可能已经从析构函数中被恢复到基类,虚拟基础被破坏等。)....

T x = a, y = b;  // "background"

// hacked pseudo-assignment
x.~T(); // should make this function call though, if it exists!
new (&x)(y);  // x = y

根据是否允许间接函数调用,可能会或可能不会接受另一种bizaare方法:

std::stringstream ss;
ss << y;
ss >> y;

更一般地说,唯一不涉及“=”符号的变异运算符是展示位置new++--,以及替代形式,例如其他答案中也讨论过xor_eq,所以我认为这是关于它的......

答案 4 :(得分:0)

Oneliner,灵感来自Michael Burr:x += (y-x);。适用于所有数字类型,O(1),甚至std::complex,以及随机迭代器(包括指针)。