用递归反转字符串的奇怪方法

时间:2015-12-07 01:22:34

标签: c recursion

我找到了这段代码:

#include <stdio.h> 
#include <ctype.h> 

int f(int c) { 
    static int b;

    if (isspace(c))
        return b = c & '\n';

    f(getchar()); 

    return putchar(c) == b && f(c); 
} 

int main(void) { 
   return f(0); 
}

我想了解这段代码是如何工作的,我从来没有看到这种类型的代码如此复杂,c & '\n'为什么这种比较putchar(c) == b

有人帮我理解这个吗?

2 个答案:

答案 0 :(得分:1)

c&amp; &#39; \ n&#39;只有在isspace为true时才会调用,计算出的值存储在变量&#39; b&#39;这是静态的,因此当它扩展和收缩时它将通过递归堆栈向前和向后传送。

我必须查看空间并找到:http://www.tutorialspoint.com/c_standard_library/c_function_isspace.htm 这表明isspace匹配了6个字符。

&amp;是一个按位AND,只有当两个参数中的位都被使能时才会返回一个设置了位的值(1)。

通过isspace中的值我们得到:

  • 0x20(空格)AND 0x0a(\ n)给出0(\ 0)字符串终止符
  • 0x09(tab)给出0x08(退格)
  • 0x0a(换行符)给出0x0a(换行符)
  • 0x0b(垂直制表符)再次给出0x0a
  • 0x0c(feed)再次给出0x08
  • 0x0d(回车)再次给出0x08

看看这个,我会说理想的结果可能是空格的终结符和换行符的换行符。我猜想其他结果是不希望或预期的,当选项卡在输入流中时,选项卡到退格转换可能会导致函数产生非常奇怪的输出。

总的来说,这是设计代码的一种愚蠢方式,可能是obfuscated C competition条目的一部分,在这些条目中,这些事情受到了欢迎。详细介绍它可能会教你一些关于C语言的非常重要的事情,但这不是你应该在生产代码中使用的东西。

答案 1 :(得分:0)

这不是一个正确的程序;如果其输入不包含PeteB发现b变为非零的字符(\t \n \v \f {,则会有无限递归{1}}) - 尝试\r