C ++交换2张使用的代码11个字符数[关闭](C++ swap two numbers using

2019-09-21 06:29发布

我的朋友给我发了锻炼,他不能做的事:
(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 ++大师):/
我不知道如何解决这个; 感谢您的帮助!

Answer 1:

使用XOR算法掉 :

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):

在所有情况下,分配的右侧和左侧的操作数的值计算后测序,并赋值表达式的值计算之前。



Answer 2:

未定义的行为,但它只是对我的电脑:

x^=y^=x^=y;

更新 :显然,这是自2011年明确定义; 看到interjay的答案。



Answer 3:

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



Answer 4:

看看这个算法: XOR算法掉 ,但你会得到一个编译警告,如:

warning: operation on ‘x’ may be undefined

如果你只有一个行中使用这种算法

x ^= y ^= x ^= y;


文章来源: C++ swap two numbers using 11 chars of code [closed]