我找到了这段代码:
#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
?
有人帮我理解这个吗?
答案 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中的值我们得到:
看看这个,我会说理想的结果可能是空格的终结符和换行符的换行符。我猜想其他结果是不希望或预期的,当选项卡在输入流中时,选项卡到退格转换可能会导致函数产生非常奇怪的输出。
总的来说,这是设计代码的一种愚蠢方式,可能是obfuscated C competition条目的一部分,在这些条目中,这些事情受到了欢迎。详细介绍它可能会教你一些关于C语言的非常重要的事情,但这不是你应该在生产代码中使用的东西。
答案 1 :(得分:0)
这不是一个正确的程序;如果其输入不包含PeteB发现b
变为非零的字符(\t
\n
\v
\f
{,则会有无限递归{1}}) - 尝试\r
。