2012-08-16 116 views
1

我的朋友11個字符的數字給我一個鍛鍊,他不能做的事:
(C++)C++交換兩個使用的代碼

int main() 
{ 
    unsigned int x = 0xB0FF14a5; 
    unsigned int y = 0x7340c00e; 
    // enter code here 
    if(x==0x7340c00e && y==0xB0FF14a5) victory(); 
    return 0; 
} 

主要目標是運行victory()功能。
假設:
-max 11個字符
- 你不能使用: 「主」, 「勝利」, 「彙編」, 「&」, 「*」, 「(」, 「/」
- 你只能使用一個分號

我試着用#define和其他一些東西,但沒有(我不是C++大師):/
我不知道如何解決這個問題;感謝幫助

+4

沒有實際使用這個問題(和它背後的想法)。因此投票結束。 – Nawaz 2012-08-16 14:28:16

+0

那麼,你必須交換x和y的值 – 2012-08-16 14:28:59

+0

'std :: swap(x,y);'? – juanchopanza 2012-08-16 14:29:21

回答

12

使用XOR swap algorithm

x^=y^=x^=y; 

這相當於(通常,見下文):

  //x==A, y==B 
x ^= y; //x==A^B, y==B 
y ^= x; //x==A^B, y==A 
x ^= y; //x==B, y==A 

它的工作原理,因爲異或由相同數量的兩倍給你原來的號碼。

在C++ 03中,單表達式版本是未定義的行爲,因此可能無法在所有編譯器/平臺上正常工作。這是因爲在修改和使用變量之間沒有順序點。

在C++ 11中,它是明確定義的。標準說(5.17.1):

在所有情況下,賦值在右值和左值操作數的值計算之後,賦值表達式的值計算之前進行排序。

+6

等價的,除了它修改和使用每個變量沒有中間順序點的事實,所以行爲是不確定的。 – 2012-08-16 14:33:38

+0

我試圖做類似的事情,但我的解決方案比限制更長。這工作,謝謝! :) – 2012-08-16 14:33:38

+0

我認爲有一些關於右聯合算子和左聯想算子... – 2012-08-16 14:46:33

8

不確定的行爲,但它只是對我的電腦:

x^=y^=x^=y; 

UPDATE:顯然,這是自2011年明確定義;見interjay的答案。

+1

+1指出這是未定義的行爲。 – user763305 2012-08-16 14:38:50

+1

它仍然未定義在C++ 11中。 – 2015-03-28 08:37:13

1

看看這個算法:XOR swap algorithm 但你會得到一個編譯警告,如:

warning: operation on ‘x’ may be undefined 

,如果你只在一個行中使用這種算法

x ^= y ^= x ^= y; 
4

13個字符,違反了其他規則,但得到工作完成,太可愛不發帖:

#include<iostream> 

void victory() 
{ 
    std::cout << "Yes we can\n"; 
} 

int main() 
{ 
    unsigned int x = 0xB0FF14a5; 
    unsigned int y = 0x7340c00e; 
    #define if(x) 
    if(x==0x7340c00e && y==0xB0FF14a5) victory(); 
    return 0; 
} 

輸出在Ideone

+0

「#define if(x)」是13個字符,超過限制。 – 2012-08-16 14:38:12

+0

你不能使用:「(」,「/」 – perilbrain 2012-08-16 14:41:04

+0

它有一個( – 2012-08-16 14:41:06