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

C 使用递归反转字符串的奇怪方法,c,recursion,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(

我发现这个代码:

#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); 
}
#包括
#包括
int f(int c){
静态int b;
if(i空间(c))
返回b=c&'\n';
f(getchar());
返回putchar(c)=b&f(c);
} 
int main(void){
返回f(0);
}
我想了解这段代码是如何工作的,我从未见过这种类型的代码如此复杂,它是用来做什么的
c&'\n'
为什么要比较
putchar(c)==b


有人帮我理解这一点吗?

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

我不得不查找isspace并发现: 这表明isspace匹配了6个字符

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

通过isspace中的值,我们得到:

  • 0x20(空格)和0x0a(\n)给出0(\0)个字符串终止符
  • 0x09(制表符)给出0x08(退格)
  • 0x0a(换行符)给出0x0a(换行符)
  • 0x0b(垂直选项卡)再次给出0x0a
  • 0x0c(馈送)再次给出0x08
  • 0x0d(回车)再次给出0x08
看看这个,我想说,理想的结果可能是空格的终止符和换行符的换行符。我猜其他结果不是期望的或预期的,当制表符在输入流中时,制表符到退格的转换可能会导致函数产生非常奇怪的输出


总的来说,这是一种设计代码的愚蠢方式,并且可能是一个项目的一部分,在这个项目中,这样的事情是值得称赞的。详细地分析它可能会教给你一些关于C语言的非常重要的东西,但这不是你应该在生产代码中使用的东西。

这不是一个正确的程序;如果其输入不包含PeteB发现
b
变为非零的字符(
\t
\n
\v
\f
\r
)-尝试
..似乎有点笨拙
c&'\n'
是'\n'上的位and运算符,实际上是十进制10或二进制1010。然后将全局变量b设置为该值。您在哪里找到此代码?我认为它会阻塞
f(getchar())在第一次迭代中。