2013-08-16 81 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,但這裏是一個字符。