2013-08-16 43 views
0

我正在学习C编程语言。什么是如果(C!= EOF)用于反向波兰计算器

在下面的代码

#include <ctype.h> 
int getch(void); 
void ungetch(int); 

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

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

    if(!isdigit(c) && c != '.') 
     return c; 
    i = 0; 
    if (isdigit(c)) 
     while (isdigit(s[++i] = c = getch()))   ; 
    if(c == '.') 
     while (isdigit(s[++i] = c = getch()))   ; 
    s[i] = '\0'; 
    if(c != EOF) 
     ungetch(c); 
    return NUMBER; 
} 

#define BUFSIZE 100 

char buf[BUFSIZE]; 
int bufp = 0; 

int getch(void) 
{ 
    return (bufp > 0) ? buf[--bufp] : getchar(); 
} 

void ungetch(int c) 
{ 
    if (bufp >= BUFSIZE) 
     printf("ungetch: too many characters\n"); 
    else 
     buf[bufp++] = c; 
} 

我想声明if(c != EOF)getop()是不必要的。

在标准输入中,每行由零个或多个字符组成,后跟一个换行符。

当语句执行时,c取出的数字后面跟着一个数字字符或.,其中c可以是换行符或除EOF以外的其他字符。

很明显,c不是EOF没有测试。

什么是if(c != EOF)用于?

对不起,如果这是一个微不足道的问题。 在此先感谢。

+4

我想它是'EOF c!= if'。 –

+1

标准输入不保证以换行符结束。只需在行的中间按^ D(在UNIX/Linux上)。 – Chris

+0

标准输入不一定包含行。它可能是一个统一的字符流。在大多数现代操作系统上它是。任何角色都可以在任何位置使用。您的应用程序可能会将其作为一系列行或完全是其他内容。 –

回答

0

在标准输入中,每行由零个或多个字符组成,后跟一个换行符。

不一定;输入是一个任意的字节流,不必以换行符结束。

当语句执行时,取出的c后面跟着一个数字字符或一个。,在这种情况下,c可能是换行符或除EOF以外的其他字符。

也可能是EOF。

很明显,c不是没有测试的EOF。

不,它不是;事实上,很明显c可能是EOF。

如果(c!= EOF)用于什么?

为了防止ungetch(EOF),这是未定义的,因为EOF不能塞进buf。

P.S.如果程序确实读取了EOF,或者如果输入流包含char范围的正数部分之外的值,那么该程序具有未定义的行为... isdigit的参数应始终为int,但这里是一个字符。