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

3

我发现了这段代码:

#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' 是对十进制值为10或二进制值为1010的字符 '\n' 进行按位与运算。然后将全局变量 b 设置为该值。 - David Maust
你在哪里找到这段代码的?我认为它会在第一次迭代中阻塞在 f(getchar()); - RedX
2个回答

1

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

我不得不查找isspace并发现:http://www.tutorialspoint.com/c_standard_library/c_function_isspace.htm,其中显示isspace匹配6个字符。

&是位AND运算符,它将返回一个值,只有在参数中的位都启用(1)时,它才会设置位。

从isspace中获取的值如下:

  • 0x20(空格)AND 0x0a(\n)给出0(\0)字符串终止符
  • 0x09(制表符)给出0x08(退格)
  • 0x0a(换行符)给出0x0a(换行符)
  • 0x0b(垂直制表符)再次给出0x0a
  • 0x0c(进纸)再次给出0x08
  • 0x0d(回车)再次给出0x08
看起来,我会说期望的结果可能是终止符用于空格,换行符用于换行字符。我猜其他结果并不是期望的或预料到的,而制表符转换为空格可能会导致函数在输入流中有制表符时产生非常奇怪的输出。
总体而言,这是一种愚蠢的设计代码的方式,可能是混淆C竞赛条目的一部分,在那里这些事情受到赞赏。详细分析它可能会教你一些关于C语言非常重要的东西,但这不是你应该在生产代码中使用的东西。

0

这不是一个正确的程序;如果它的输入不包含PeteB找到b变为非零的字符(\t \n \v \f \r),则会出现无限递归 - 尝试… </dev/null


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接