我正在研究投资字符串的两个功能问题是我发现它很难理解它们是如何工作的我在代码中看到了奇怪的东西,这部分
return b = c & '\n';
另一件事是你使用三元运算符的方式
b + e ?: f(0);
省略第一个表达式我留下两个函数
int b, e;
void f(c)
{
e = 13 & c;
if(isspace(c)) return;
b++, f(getchar());
b--, putchar(c);
b + e ?: f(0);
}
int f(c)
{
static int b;
if(isspace(c))
return b = c & '\n';
f(getchar());
printf("(%c)\n", b);
return putchar(c) == b && f(c);
}
有人向我解释这是怎么回事?
答案 0 :(得分:1)
你的第一个表达:
return b = c & '\n';
会将表达式c & '\n'
的值赋给变量b
并返回它。
c & '\n'
是一个按位操作,对c
和\n
的二进制表示执行逻辑AND运算。
为了使它更加杰出,让我们采用ASCII表并解码这些字符:
c
:十进制99 - >二进制01100011
'\ n':十进制10 - >二进制00001010
所以我们只是逐句AND
,结果我们得到00000010
,即十进制2. b
变量被赋值该值,并返回相同的值。
b + e ?: f(0);
是一个三元条件语句,它首先检查b+e
的逻辑值,如果它评估为true
将无效(因为:
之前没有任何内容),否则将调用函数f
。
答案 1 :(得分:0)
这两个函数似乎都被故意写成令人困惑,以至于我并非100%确定他们应该做什么,或者他们是否真的这样做了。因此,我不打算解释它们,而是给我自己的程序,它可以做我认为他们应该做的事情,但是以一种不那么特殊的方式:
#include <stdio.h>
#include <ctype.h>
void reverse_word(void)
{
int c = getchar();
if (c == EOF)
return;
if (isspace(c)) {
ungetc(c, stdin);
return;
}
reverse_word();
putchar(c);
}
void skip_whitespace(void)
{
int c = getchar();
if (c == EOF)
return;
if (!isspace(c)) {
ungetc(c, stdin);
return;
}
putchar(c);
}
int main(void)
{
do {
reverse_word();
skip_whitespace();
} while (!feof(stdin));
return 0;
}
您会注意到reverse_word
和skip_whitespace
几乎相同。考虑差异以了解reverse_word
的工作原理。
$ echo 'the quick brown fox jumps over the lazy dog' | ./a.out
eht kciuq nworb xof spmuj revo eht yzal god