我找到了这段代码:
#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/