gpt4 book ai didi

c - K&R C 练习 4-11,静态变量

转载 作者:行者123 更新时间:2023-12-05 01:34:46 24 4
gpt4 key购买 nike

所以过去几周我一直在浏览 K&R 书。我已经按顺序完成了,并没有真正跳过太多。如果我遇到困难,我通常可以通过谷歌搜索示例并找到答案,但这一次,我被难住了。

第 4.6 节涉及在外部和内部声明静态变量。练习是这样说的:

Exercise 4-11. Modify getop so that it doesn't need to use ungetch. Hint: use an internal static variable.

这与波兰语计算器有关。 getop 收集下一个运算符或操作数,ungetch 将字符推回输入堆栈。

原始函数如下所示:

int getop(char s[])
{
int i, c;

while ((s[0] = c = getch()) == ' ' || c == '\t')
;

s[1] = '\0';
if (!isdigit(c) && c != '.' && c != '-' )
return c; /* not a number */
i = 0;
if (c == '-') {
if (isdigit(c = getchar())) {
s[i] = '-';
ungetch(c);
}
else {
ungetch(c);
return '-';
}
}

if (isdigit(c)) /* collect integer part */
while (isdigit(s[++i] = c = getch()))
;

if (c == '.') /* collect a fraction part */
while (isdigit(s[++i] = c = getch()))
;

s[i] = '\0';

if (c != EOF)
ungetch(c);

return NUMBER;
}

我查过的大多数例子都是这样的:

static int buf = EOF;

if (buf != EOF && buf != ' ' && buf != '\t'
&& !isdigit(buf) && buf != '.') {
c = buf;
buf = EOF;
return c;
}
if (buf == EOF || buf == ' ' || buf == '\t')
while ((*s = c = getch()) == ' ' || c == '\t')
;
else
*s = c = buf;
buf = EOF;

我的问题是它没有考虑到我们之前应该对 getop 进行的修改,即处理负数。我发现的所有示例似乎都没有利用变量是静态的这一事实,因此在调用函数后仍然存在。我们只是在最后将它设置为 EOF。如果函数调用之间的变量是什么无关紧要,为什么要使用静态变量?

最后,我不确定如何使用静态变量将 c 粘回输入堆栈。 getch 在 getch 和 ungetch 之间使用共享数组,而 getop 并不知道。

对于这样一个简单的例子,很抱歉发布了更长的帖子。

最佳答案

基本思想是,在 getop 中您当前拥有 ungetch() 的任何位置,您都可以将静态变量设置为您不希望获取的值。然后,无论你在哪里调用 getch(),如果它是有效的,你就会从静态变量中获取值(你可能需要第二个静态变量来说明它是否有效,当你阅读时你会清除它它,并在您取消进入时进行设置)。

关于c - K&R C 练习 4-11,静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10437580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com