=符号的备选方案 我被要求实现一个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; }

=符号的备选方案 我被要求实现一个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; },c++,equals,C++,Equals,还有其他通用解决方案吗 谢谢我不确定(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 de

还有其他通用解决方案吗

谢谢

我不确定
(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

如果假定
x
y
为int:

while (x < y) {
    ++x;
}
while (y < x) {
    --x;
}
while(x
以下内容在任何实际环境中都不是非常有用,但它至少根据其规则解决了“问题”:

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

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

    return 0;
}
intmain(intargc,char*argv[])
{
INTY(5);
int x(y);

警告:在脆弱的黑客世界里,这会变得很丑陋

对任意类型的赋值有时必须调用函数-无论是赋值运算符还是[copy]constructor.Placement
new
是一个运算符,而不是一个函数调用,尽管它可能需要将参数传递给构造函数。要一般地重建一个对象,你需要知道它事先已被破坏,这确实需要函数调用,但不需要赋值-那么这是允许的还是不允许的?:-)无论如何,这个想法仍然是错误的如果重建可以抛出,则OK,因为可以对已经被破坏的对象再次调用析构函数。实际上,您可以编写析构函数以确保安全(例如,
删除之后的空指针),或者构造函数不抛出,但这是未定义的行为,不是真正的泛型(您可能会遇到各种复杂情况:虚拟分派指针可能已经从插入的析构函数还原到基类,虚拟基类被析构函数等等)


根据是否允许间接函数调用,可以接受也可以不接受的另一种商业方法:

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


更一般地说,唯一在其典型形式中不涉及“=”符号的变异运算符是placement
new
++
--
,其他答案中也讨论了其他形式,如
xor_eq
,所以我想就这些了……

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

面试问题?家庭作业?
memcpy
只保证适用于POD类型,所以它的泛型是相对的。@神秘的我猜测是面试
memcpy
是一个函数……为什么不:
int y(5);整数x(y)他确实说过没有等于,也没有函数,所以我想这排除了|=和&=aswell@JesusRamos我有点希望他指的是=运算符。否则你不能将
x
传递给任何东西,也不能修改它,所以答案大概是:这是不可能的?@JesusRamos:没关系,你可以一直使用
或_eq
和_eq
取而代之!@OliCharlesworth好地方!我把它添加到了答案中,并将其标记为社区维基,因为它不再是我的答案。另一个愚蠢的选择是:
x xor\u eq x
清除
x
,然后
x或_eq y
复制
y
位。感谢这一个我喜欢的答案,它真的没有功能。But它仅限于整数。@user1270438:整数和类似的东西,比如一些双向迭代器和指针,如果它们指向同一个容器/数组。可能会对float/double产生错误的结果。我认为问题是要求分配给现有变量
x
,但这当然值得列出以供考虑…这就是我要找的:)帮了大忙,谢谢:)
std::stringstream ss;
ss << y;
ss >> y;