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

K&;R C练习4-11,静态变量,c,C,所以在过去的几周里我一直在看K&R的书。我把一切都安排好了,没跳过多少。如果我在某件事上遇到困难,我通常可以通过谷歌搜索这个例子并找到答案,但这一次,我被难住了 第4.6节涉及声明静态变量,包括外部变量和内部变量。演习说: 练习4-11。修改getop,使其不需要使用ungetch。提示:使用内部静态变量 这与波兰计算器有关。getop收集下一个运算符或操作数,ungetch将字符推回输入堆栈 原始函数如下所示: int getop(char s[]) { int i, c; while ((

所以在过去的几周里我一直在看K&R的书。我把一切都安排好了,没跳过多少。如果我在某件事上遇到困难,我通常可以通过谷歌搜索这个例子并找到答案,但这一次,我被难住了

第4.6节涉及声明静态变量,包括外部变量和内部变量。演习说:

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

这与波兰计算器有关。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;
我查找的大多数示例如下所示:

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()
,如果静态变量有效,您都会从静态变量中获取值(您可能需要第二个静态变量来说明它是否有效,您在读取时会清除该变量,在取消进入该变量时进行设置)。

谢谢您的帮助。我让它对负值起作用,但如果没有ungetch(),减法就不能起作用。不过我想我理解了这个练习的大部分概念,所以我将继续。我在这上面花了太多时间。再次感谢!