首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >K&R C练习4-11,静态变量

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

Stack Overflow用户
提问于 2012-05-03 18:51:49
回答 1查看 909关注 0票数 3

在过去的几周里,我一直在阅读K&R的书。我把这一切都做得井井有条,并没有跳过多少次。如果我被困在某件事上,我通常可以搜索这个例子并找到一个答案,但这次,我被难住了。

4.6节涉及在外部和内部声明静态变量。演习内容如下:

练习4-11.修改getop,使其不需要使用ungetch。提示:使用内部静态变量。

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

原始函数如下所示:

代码语言:javascript
运行
复制
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;
}

我查过的大多数例子如下所示:

代码语言:javascript
运行
复制
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不知道。

对于这样一个简单的例子,很抱歉出现了较长的帖子。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-03 19:03:12

基本思想是,在getop中的任何地方,您现在都有ungetch(),相反,您可以将静态变量设置为您无法得到的值。然后,无论您在哪里调用getch(),如果静态变量是有效的,就会得到它的值(您可能需要第二个静态变量来说明它是否有效,在读取它时清除它,并在不进入它时设置它)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10437580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档