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

标签 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

有人帮我理解这个吗?

最佳答案

c & '\n' 仅当 isspace 为 true 时才被调用,计算出的值存储在静态变量 'b' 中,因此当递归堆栈扩展和收缩时,它将向前和向后通过递归堆栈。

我必须查找 isspace 并发现:http://www.tutorialspoint.com/c_standard_library/c_function_isspace.htm 显示 isspace 匹配了 6 个字符。

& 是按位与,仅当两个参数中的位都启用 (1) 时,它才会返回一个设置了位的值。

浏览 isspace 中的值我们得到:

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

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

总的来说,这是一种愚蠢的代码设计方式,可能是 obfuscated C competition 条目的一部分。这样的事情是值得鼓掌的。详细地拆解它可能会教您一些有关 C 语言的非常重要的知识,但这不是您应该在生产代码中使用的东西。

关于c - 用递归反转字符串的奇怪方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34125039/

相关文章:

c - C中printf()函数的返回值

c - UNIX 套接字连接被拒绝

javascript - 是什么阻止函数被无限调用?

c++ - 从另一个线程调用 CFRunLoopStop 是否安全?

c - 关于操作系统的进程安排?

c - strdup 的用法

c++ - 相同的递归函数需要私有(private)和公共(public)方法

Haskell 提示/为什么这不是线性缩放?

php - 如何在 PHP 中递归删除目录及其全部内容(文件 + 子目录)?

recursion - 如何访问 OCaml 递归模块中定义的类型的字段?