C++使用 11 个字符的代码交换两个数字

C++ swap two numbers using 11 chars of code

本文关键字:交换 两个 数字 代码 使用 字符 C++      更新时间:2023-10-16

我的朋友给我发了一个他做不到的练习:
(C++)

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

主要目标是运行victory()函数。
假设:
-最多 11 个字符
-您不能使用:"主要","胜利","asm","&","*","(","/"
-您只能使用一个分号

我尝试了#define和其他一些东西,但什么都没有(我不是C++主人):/
我不知道如何解决这个问题;感谢您的帮助!

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

在所有情况下,赋值都是在左右操作数的值计算之后以及赋值表达式的值计算之前排序的。

未定义的行为,但适用于我的电脑:

x^=y^=x^=y;

更新:显然,自2011年以来,这是明确的;请参阅Interjay的答案。

13 个字符并违反其他规则,但完成了工作并且太可爱了,无法发布:

#include<iostream>
void victory()
{
   std::cout << "Yes we cann";
}
int main()
{
    unsigned int x = 0xB0FF14a5;
    unsigned int y = 0x7340c00e;
    #define if(x)
    if(x==0x7340c00e && y==0xB0FF14a5) victory();
    return 0;
}

在 Ideone 上的输出

看看这个算法: 异或交换算法但是你会得到一个编译警告,比如:

warning: operation on ‘x’ may be undefined

如果您只在一行中使用此算法

x ^= y ^= x ^= y;