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())代码>在第一次迭代中。