我被要求实现一个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 :(得分:11)
如果假设x
和y
为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
,以及随机迭代器(包括指针)。