2016-03-15 134 views
1

該代碼被用來創建一個功能正常的計算器程序。整個事情有點長,所以我不會進入到這一切,但這裏的一個部分:爲什麼你需要返回一些東西到輸入流?

Token Token_stream::get() 
{ 
    if (full) { // do we already have a Token ready? 
     full = false; // remove Token from buffer 
     return buffer; 
    } 
    char ch; 
    cin >> ch; // note that >> skips whitespace (space, newline, tab, etc.) 

    switch (ch) { 
     case ';': // for 「print」 
     case 'q': // for 「quit」 
     case '(': case ')': case '+': case '–': case '*': case '/': 
      return Token{ch}; // let each character represent itself 
     case '.': 
     case '0': case '1': case '2': case '3': case '4': 
     case '5': case '6': case '7': case '8': case '9': 
     { 
      cin.putback(ch); // put digit back into the input stream 
      double val; 
      cin >> val; // read a floating-point number 
      return Token{'8',val}; // let ‘8’ represent 「a number」 
     } 
     default: 
      error("Bad token"); 

    } 
} 

爲什麼你需要把章回輸入流?難道你不能只使用ch輸入而不是利用val的全新變量?

回答

3

是的,這是可能的。但是,仍然有更多的數據需要處理。到那時,ch只會有第一個數字。

例如,如果讀取輸入123,'1'字符將被讀入ch。從那裏,'1'將被放回到輸入,然後將123的全部內容讀入val。如果沒有調用cin.putback(ch);,則返回的Token將具有值23而不是123

另一種方法是使用ch中的值,然後以該方式讀取其餘的數字。然而,作者的意圖是使用更安全和已製作的方法來讀取double

+0

呃,對不起,我還是有點困惑。當你輸入123時,只有'1'會被讀入ch?或者它會繼續,因爲讀數爲1,將其放回,讀取爲2,將其放回等等。在那種情況下,爲什麼我不能完全消除0-9的情況並依賴cin >> val? – blueyfooey

+0

@blueyfooey'當你輸入123時,只有'1'會被讀入ch?'是的。從那時起,它知道下一個標記是一個數字,所以它讀入'123'。之後,通過讀取數字,輸入已經超過了'123'。然後它會處理接下來的任何事情。 – Obicere

+0

好的,這是有道理的。但是,在那個時候使用cin >> val會不會更簡單呢? – blueyfooey

相關問題