我发现此代码:

#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比较呢?

有人帮我理解吗?

最佳答案

仅当isspace为true时才调用c&'\ n',计算出的值存储在静态的变量'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(Feed)再次给出0x08
0x0d(回车)再次给出0x08


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

总体而言,这是一种愚蠢的设计代码方式,并且可能是obfuscated C competition条目的一部分,而这种名称值得赞赏。详细地将其分开可能会教给您一些有关C语言的非常重要的知识,但这不是您应该在生产代码中使用的目标。

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

10-12 14:50