1

我的朋友给我发了一个他不会做的练习:
(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 个字符
-你不能使用:“main”、“victory”、“asm”、“&”、“*”、“(”、“/”
-你只能使用

我试过的一个分号#define还有其他一些事情,但什么都没有(我不是 C++ 大师):/
我不知道如何解决这个问题;感谢您的帮助!

4

4 回答 4

12

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

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

于 2012-08-16T14:30:30.433 回答
8

未定义的行为,但在我的电脑上工作:

x^=y^=x^=y;

更新:显然,这是自 2011 年以来的明确定义;见interjay的回答。

于 2012-08-16T14:31:11.307 回答
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上输出

于 2012-08-16T14:36:24.673 回答
1

看看这个算法:XOR swap algorithm 但是你会得到一个编译警告,比如:

warning: operation on ‘x’ may be undefined

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

x ^= y ^= x ^= y;
于 2012-08-16T14:31:52.477 回答