【问题标题】:Hello world encryption recursive call to mainHello world 加密递归调用 main
【发布时间】:2015-03-24 20:16:02
【问题描述】:

我发现了一段很奇怪的代码,我说这是因为对 main 进行了递归调用,这对我来说是新事物,因此我询问有关它的信息,最重要的是我想详细说明用于打印 hello 的方法世界,如果不是太麻烦的话。程序如下:

#include <stdio.h>

int main(void)
{
    static int i = 0xc;    
    putchar(*("\x1\x22\x22\x70\x65\x6f\x76\x6e\x21\x62\x6d\x70\x69" + i--) - 1); 
    return  i ? main() : 0;    
}

谢谢

【问题讨论】:

  • 没有任何实际用途的技巧编程。代码有效,你有什么问题?
  • 我认为作者是懦弱的。他忘记使用return i &amp;&amp; main(); 完成面条烘焙。关于实际问题,创建一些临时变量并在调试器中单步执行此单行。它的工作原理将变得显而易见。
  • 不要试图理解该代码是如何工作的......只是忘记了。学习编写可理解的代码:-)

标签: c recursion main


【解决方案1】:

递归调用main 是完全合法的。

输出为"hola mundo!!"

关键字符串是

"\x1\x22\x22\x70\x65\x6f\x76\x6e\x21\x62\x6d\x70\x69"

相同
"\0!!odnum aloh"

移动一个字符(即用i 代替hp 代替o 等),即:

"\x1\"\"peovn!bmpi"

那么,

(*("\x1\x22\x22\x70\x65\x6f\x76\x6e\x21\x62\x6d\x70\x69" + i--)

相同
"\x1\"\"peovn!bmpi"[i--]

所以每个putchar 输出字符串的一个字符减一,从右到左。

【讨论】:

  • 递归调用main 是完全合法的。我不会称它为“OK”。
  • @AlexD 因为如果关键字符串是“\0!!odnum aloh”,则字符会移动一个位置
  • @cheroky 为简单起见,我们只取第一个词。代码中的字符为:"x62\x6d\x70\x69",同"bmpi"。如果我们将所有字符减 1,我们得到"aloh"。 (“移动一个字符”我的意思是“增加/减少一个”。它与左/右移动无关。)
  • @AlexD 因为不直接保存“bmpi”而避免位移?
  • @cheroky 也许我不明白你的问题。您可以使用“x62\x6d\x70\x69”或"bmpi"。这些只是编写相同字符串的两种方式。
猜你喜欢
  • 2014-05-02
  • 2022-01-22
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
相关资源
最近更新 更多