2017-06-22 31 views
2

大家好,我試圖從C語言編程書的問題由Brian W. Kernighan的(作者),丹尼斯·裏奇M.(作者)。該手冊提供的代碼對於基本的逆波蘭計算器,但我不明白#define NUMBER '0'如何與switch語句一起工作:C編程switch語句找到一個數字或字母

它如何能夠捕獲所有的數字,儘管我們沒有每個數字的情況。接下來的問題還要求我處理像sincospow這樣的案例。我假設也有類似的方式來做到這一點,但如果解釋會幫助我更好。

getop得到下一個操作或數字操作數,pushpop是正規堆棧功能和atof將ASCII轉換浮動。

#define NUMBER '0' 


    int type; 
    double op2; 
    char s[100]; 

    while ((type = getop(s)) != EOF) { 
     switch (type) { 
      case NUMBER: 
       push(atof(s)); 
       break; 
      case '+': 
       push(pop() + pop()); 
       break; 
      case '*': 
       push(pop() * pop()); 
       break; 
      case '-': 
       op2 = pop(); 
       push(pop() - op2); 
       break; 
      case '/': 
       op2 = pop(); 
       if (op2 != 0.0) 
        push(pop()/op2); 
       else 
        printf("error: zero divisor\n"); 
       break; 
      case '%': 
       op2 = pop(); 
       if (op2 != 0.0) 
        push((int)pop() % (int)op2); 
       else 
        printf("error: division by zero\n"); 
       break; 
      case '\n': 
       printf("\t%.8g\n", pop()); 
       break; 
      default: 
       printf("error: unknown command %s\n", s); 
       break; 
     } 
    } 
    return 0; 
} 
+2

我猜'getop()''返回如果NUMBER'其參數's'恰好是數字。 – Hasturkun

+0

看看'開關(類型)'行,直到啓示來臨。 –

+0

@Hasturkun是啊,我看到了什麼發生了感謝。 – cv14

回答

2

的C預編譯器讀取並分析你的源代碼之前執行文本替換。 NUMBER替換爲'0',這是代表數字0的字符的值。

當從輸入中分析數字並將數字複製到s時,函數getop()可能會返回值'0'atof()將其轉換爲數字。

如果你有機會爲getop()的源代碼,你會看到它是如何解析的數字,空格,註釋和運營商。

注意,你不應該用浮點值使用%。您應該改用fmod()

+0

整數除法溢出不應該是一個問題,因爲使用浮點運算... – Aconcagua

+0

@Aconcagua:OK,錯過了。爲什麼麻煩測試零分區呢?將非零值除以零產生無窮大,0.0/0.0產生NaN。 – chqrlie

+0

數學正確性可能 - 不過,我錯過了爲%,確實是一個轉換成int值做... – Aconcagua