作者的代码是否正确? - B. Stroustrup 的 PPP 使用 C++:第 7 章,第 7.2 节 - 输入和输出

Is the author's code correct? - B. Stroustrup's PPP using C++: Chapter 7, Section 7.2 - Input & Output

我正在使用 B.Stroustrup 的 PPP 使用 C++ 第一版学习 C++。第 7 章是第 6 章的扩展,其中开发了一个基本的计算器,它采用表达式(如 1+2;)来产生输出(';' 用于终止表达式)。 (我使用的是 Visual Studio 2013)

7.2小节,为用户改进程序的布局,作者期望这样-

> 2+3;
=5
> 5*7;
=35
>

and(输入多个表达式)

> 2+3; 5*7; 2+9;
=5
> =35
> =11
> 

通过使用此代码 -

main():

double val = 0;
while (cin) {
    cout << "> "; // print prompt
    Token t = ts.get(); // get token from Token_stream ts
    if (t.kind == 'q' ) break; // 'q' for quit
    if (t.kind == ';' )      // ';' to print value
        cout << "= " << val << '\n'; // print result
    else
        ts.putback(t);  // put back token in Token_stream ts
    val = expression();  // evaluate expression
}

但据我所知,这段代码无法生成这样的输出,并且可以像这样工作,

  1. 读取令牌
  2. 如果是退出或者打印一些值,就执行,否则就放那个 令牌返回 Token_stream.
  3. 然后,计算一个表达式的值(假设有 用户输入的表达式)。如果没有expression/token可读取,程序只是等待输入(在primary()函数中)。
  4. 表达式求值后,转到步骤 1。

因此,表达式的值只会在 main() 检测到 ';' 时打印,并且每次都会打印 >,甚至在打印值之前表达式,甚至是简单表达式的输出,1+2; 我的程序是 -

> 1+2;
> =3
2+3;
> =5
_

第 3 行有光标(故意使用下划线)。

那么,我是否正确认为作者使用了错误的代码?还是我只是疯了,还有其他我看不到的东西?

Here是计算器的完整代码。

Here 是图书馆 std_lib_facilities.h.

你没疯

已出版的书籍有错误并非闻所未闻。很多时候,一本书的相应网站会有一个在线 "errata" sheet,其中包含等待下一次印刷的所有更正。

我刚查过。我在 Stroustrup 的网站上发现了一些拼写错误。这是他的书的勘误表 link:http://www.stroustrup.com/Programming/PPP2errata.html

我没有看到第 7 章的任何内容。但是如果你确定你发现了一个错误,请给他发一封电子邮件。有机会他会回复并谢谢你。

我认为你的代码块只是因为这一行而出现轻微错误:

cout << "> "; // print prompt

它在每次使用令牌时打印 > 个字符。

我觉得这样比较合理:

double val = 0;

cout << "> "; // print prompt the first time.

while (cin)
{
    Token t = ts.get();              // get token from Token_stream ts

    if (t.kind == 'q' )
    {
        break;          // 'q' for quit
    }

    if (t.kind == ';' )  // ';' to print value
    {   
        cout << "= " << val << '\n'; // print result
        cout << "> ";                // print new prompt
    }
    else
    {
        ts.putback(t);  // put back token in Token_stream ts
    }

    val = expression();  // evaluate expression
}