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

Pat*_*iec 1 c++ obfuscation

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

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

主要目标是运行victory()功能.
假设:
-max 11个字符
- 你不能使用:"main","victory","asm","&","*","(","/"
- 你只能用一个分号

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

int*_*jay 12

使用XOR交换算法:

x^=y^=x^=y;
Run Code Online (Sandbox Code Playgroud)

这相当于(通常见下文):

          //x==A,   y==B
x ^= y;   //x==A^B, y==B
y ^= x;   //x==A^B, y==A
x ^= y;   //x==B,   y==A
Run Code Online (Sandbox Code Playgroud)

它的工作原理是因为两次相同的XORing可以得到原始数字.

在C++ 03中,单表达式版本是未定义的行为,因此可能无法在所有编译器/平台上正常工作.这是因为修改和使用变量之间没有序列点.

在C++ 11中,它是明确定义的.标准说(5.17.1):

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

  • 等价,除了它修改和使用每个变量而没有中间序列点的事实,因此行为是不确定的. (6认同)
  • @AlexanderChertov:这是迈克所说的未定义行为,因为变量访问之间没有序列点.运算符关联性只告诉解析器如何解析表达式(即它确定表达式被解析为`x ^ =(y ^ =(x ^ = y));`)并且不是真正相关的. (2认同)

Mik*_*our 8

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

x^=y^=x^=y;
Run Code Online (Sandbox Code Playgroud)

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