2012-03-15 63 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以及隨機迭代器(包括指針)。