while(true)循环在这个C ++程序中做了什么?

时间:2018-03-09 14:49:14

标签: c++ parsing while-loop calculator

https://gist.github.com/henrikhodne/145235

我无法理解这个程序应该如何工作。如何通过此程序解析“(23 * 2)/ 9 + 3”这样的声明?

这是Bjarne Stroustrup的C ++书中的计算器程序。它应该遵循这个语法:

表达式:

Term

Expression "+" Term    // Addition

Expression "–" Term    // Subtraction

期限:

    Primary


    Term "*" Primary    // Multiplication


    Term "/" Primary    // Division


    Term "%" Primary    // Remainder (modulo)

初​​级:

        Number

            "(" Expression ")"    // grouping

数:

      floating-point-literal

根据此语法解析输入字符的各个函数实现如下:

double expression()
{
    double left = term();  // Read and evaluate a Term
    Token t = ts.get();    // Get the next token from the token stream
    while(true) {
       switch(t.kind) {
           case '+':
               left += term();  // Evaluate the term and add
               t = ts.get();
               break;
           case '-':
               left -= term();  // Evaluate the term and subtract
               t = ts.get();
               break;
           default:
               ts.putback(t);   // Put t back into the token stream.
               return left;     // Finally: no more + or -: return the answer
       }
    }
}


double term()
{
    double left = primary();
    Token t = ts.get();     // Get the next token from the token stream

    while (true) {
        switch (t.kind) {

            case '*':
                left *= primary();
                t = ts.get();
                break;

            case '/':
                {
                    double d = primary();
                    if (d == 0)
                        error("divide by zero");
                    left /= d;
                    t = ts.get();
                    break;
                }

            default:
                ts.putback(t);
                return left;
        }
    }

    double primary()     // Read and evaluate a Primary
    {
        Token t = ts.get();
        switch (t.kind) {

            case '(':    // Handle '(' expression ')'
                {
                    double d = expression();
                    t = ts.get();
                    if (t.kind != ')')
                        error("')' expected");
                    return d;
                }

            case '8':            // We use '8' to represent a number
                return t.value;  // Return the number's value

            default:
                error("primary expected");
        }
    }

我不明白while(true)循环在expression()中的行为。 (真实)条件是做什么的?

3 个答案:

答案 0 :(得分:1)

它不断迭代令牌流,直到它能够找到一个运算符" *" " +"或" - "。中断确保循环不会像

那样保持无限循环
let tours = [{
    'id': 1,
    price: 200
  },
  {
    'id': 1,
    price: 300
  },
  {
    'id': 3,
    price: 150
  },
  {
    'id': 2,
    price: 110
  },
  {
    'id': 3,
    price: 120
  },
  {
    'id': 2,
    price: 100
  }
];

var output = tours.reduce((acc, c) => {
  acc[c.id] = acc[c.id] ? Math.min(c.price, acc[c.id]) : c.price;
  return acc;
}, {});

console.log(output);

将永远运行

答案 1 :(得分:0)

while(true)是一个常见的结构。它是无限循环。但是它可以return来自。return。在查看代码时,我们会在某些case分支中看到while

因此,case将迭代,直到其正文中的某些代码更改状态,以便执行包含return的{​​{1}}。然后,这将终止while(true)

答案 2 :(得分:0)

表达式()中的

- 真正的条件是无用的,因为无论在默认情况下会发生什么,函数都会返回一些东西,但通常是(true)循环,直到你使用break,return或任何让你离开循环的东西