2012-03-15 44 views
3

我被要求实现一个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; 
} 

其他的通用解决方案?

感谢

+0

面试问题?家庭作业? – Mysticial 2012-03-15 00:47:55

+0

'memcpy'只保证适用于POD类型,所以它的通用性是相对的。 – Josh 2012-03-15 00:48:06

+1

@Mysticial我的猜测是面试 – 2012-03-15 00:48:15

回答

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 

或者,按照奥利查尔斯沃思的评论下面,如果你不想=符号则:

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 
+0

他确实说过没有等于也没有功能,所以我想这也是排除| =和&= – 2012-03-15 00:49:54

+0

@JesusRamos我有点希望他的意思是=运算符。否则,你不能将'x'传递给任何东西,而且你也不能修改它,所以大概的答案是:这是不可能的? – Tommy 2012-03-15 00:51:10

+0

这也是我的猜测,除非您使用内联汇编。 – 2012-03-15 00:52:12

11

如果xy是assum ED为int:

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

感谢这个我喜欢的,它真的没有功能。但它仅限于整数。 – user1270438 2012-03-15 01:33:37

+0

@ user1270438:整数和类似的东西,像一些双向迭代器和提供它们到同一个容器/数组的指针。可能会产生float/double的错误结果。 – 2012-03-15 03:42:26

1

以下是不以任何真实的语境非常有用,但它至少可以解决占其规则“问题”:

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

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

    return 0; 
} 
+0

我认为这个问题要求赋值给一个现有的变量'x',但是这当然值得列出考虑...... – 2012-03-15 02:56:19

+0

这是一个我正在寻找:)伟大的帮助,谢谢:) – user1270438 2012-03-15 08:23:40

0

警告:这得难看。坚定地在脆弱的骇客之地; --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也已在其他的答案中讨论的可替代的形式,因此我认为就是这样......

0

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