2016-03-15 2 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

Смежные вопросы