【问题标题】:C++ swap two numbers using 11 chars of code [closed]C ++使用11个字符的代码交换两个数字[关闭]
【发布时间】:2012-08-12 22:18:55
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这个问题(及其背后的想法)没有实际用途。所以投票关闭。
  • 好吧,你必须交换 x 和 y 的值
  • @juanchopanza:15 个字符
  • @juanchopanza:超过 11 个字符...
  • @juanchopanza 你不能用(

标签: c++ obfuscation


【解决方案1】:

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

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

【讨论】:

  • 等价,除了它修改和使用每个变量时没有中间序列点,因此行为是未定义的。
  • @AlexanderChertov:正如 Mike 所说,这是未定义的行为,因为变量访问之间没有序列点。运算符关联性只告诉解析器如何解析表达式(即它确定表达式被解析为x^=(y^=(x^=y));),并不真正相关。
  • @MikeSeymour:实际上,我查看了标准,我相信这是在 C++11 中定义良好的,请参阅我的编辑。
  • @AlexanderChertov:是的,“副作用”是一个定义明确的术语,用于表示评估表达式导致的程序状态变化。评估赋值表达式有两件事:计算表达式的值(例如,在 a=b=c; 中分配给 a 的值),以及修改分配给的 lvalue 的副作用。在 2011 年之前,只保证在计算表达式的其余部分之前对值计算而不是副作用进行排序,因此在一个表达式中修改 same 对象两次具有未定义的行为。显然,它现在定义明确了。
  • 这在 C++11 中也没有明确定义。第一个^=x的值的读取与第三个^=的存储之间没有顺序关系。
【解决方案2】:

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

x^=y^=x^=y;

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

【讨论】:

  • +1 用于指出未定义的行为。
  • 在 C++11 中仍未定义。
【解决方案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 上的输出

【讨论】:

  • "#define if(x)" 是 13 个字符,超过了限制。
  • 你不能使用:"(", "/"
  • 太好了。我在等预处理器黑客……
  • 这是“未解决”,只需删除条件即可。
  • 另外:“不能使用”(“”。但是:不错的一个:-)。
【解决方案4】:

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

warning: operation on ‘x’ may be undefined

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

x ^= y ^= x ^= y;

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多