我被要求實現一個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;
}
其他的通用解決方案?
感謝
我不確定什麼(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
他確實說過沒有等於也沒有功能,所以我想這也是排除| =和&= – 2012-03-15 00:49:54
@JesusRamos我有點希望他的意思是=運算符。否則,你不能將'x'傳遞給任何東西,而且你也不能修改它,所以大概的答案是:這是不可能的? – Tommy 2012-03-15 00:51:10
這也是我的猜測,除非您使用內聯彙編。 – 2012-03-15 00:52:12
如果x
和y
是assum ED爲int:
while (x < y) {
++x;
}
while (y < x) {
--x;
}
感謝這個我喜歡的,它真的沒有功能。但它僅限於整數。 – user1270438 2012-03-15 01:33:37
@ user1270438:整數和類似的東西,像一些雙向迭代器和提供它們到同一個容器/數組的指針。可能會產生float/double的錯誤結果。 – 2012-03-15 03:42:26
以下是不以任何真實的語境非常有用,但它至少可以解決佔其規則「問題」:
int main(int argc, char* argv[])
{
int y(5);
int x(y);
std::cout << x << " " << y << std::endl;
return 0;
}
我認爲這個問題要求賦值給一個現有的變量'x',但是這當然值得列出考慮...... – 2012-03-15 02:56:19
這是一個我正在尋找:)偉大的幫助,謝謝:) – user1270438 2012-03-15 08:23:40
警告:這得難看。堅定地在脆弱的駭客之地; --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
也已在其他的答案中討論的可替代的形式,因此我認爲就是這樣......
Oneliner,靈感來自Michael Burr:x += (y-x);
。適用於所有數字類型,O(1),甚至std::complex
以及隨機迭代器(包括指針)。
面試問題?家庭作業? – Mysticial 2012-03-15 00:47:55
'memcpy'只保證適用於POD類型,所以它的通用性是相對的。 – Josh 2012-03-15 00:48:06
@Mysticial我的猜測是面試 – 2012-03-15 00:48:15