=符号的备选方案 我被要求实现一个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.Placementnew
是一个运算符,而不是一个函数调用,尽管它可能需要将参数传递给构造函数。要一般地重建一个对象,你需要知道它事先已被破坏,这确实需要函数调用,但不需要赋值-那么这是允许的还是不允许的?:-)无论如何,这个想法仍然是错误的如果重建可以抛出,则OK,因为可以对已经被破坏的对象再次调用析构函数。实际上,您可以编写析构函数以确保安全(例如,删除之后的空指针),或者构造函数不抛出,但这是未定义的行为,不是真正的泛型(您可能会遇到各种复杂情况:虚拟分派指针可能已经从插入的析构函数还原到基类,虚拟基类被析构函数等等)
根据是否允许间接函数调用,可以接受也可以不接受的另一种商业方法:
std::stringstream ss;
ss << y;
ss >> y;
std::stringstream-ss;
ss>y;
更一般地说,唯一在其典型形式中不涉及“=”符号的变异运算符是placementnew
、++
和--
,其他答案中也讨论了其他形式,如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;