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

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

本文关键字:7章 输出 输入 C++ 2节 PPP 是否 代码 视觉 Stroustrup 使用      更新时间:2023-10-16

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

在7.2节中,为了使用户改进程序的布局,作者期望-

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

和(输入多个表达式)

> 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. 如果要退出或打印一些值,那么执行它,否则放置它
  3. 然后,计算表达式的值(假设存在)由用户输入的表达式)。如果没有要读取的表达式/令牌,程序就等待输入(在primary()函数中)。
  4. 表达式求值完成后,转到步骤1

因此,只有当main()检测到';'时才会打印表达式的值,而>每次都会打印,甚至在打印表达式的值之前,甚至一个简单的表达式1+2;的输出都是-

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

在第三行带有光标(故意使用下划线)。

所以,我是正确的,作者是使用错误的代码?还是我只是疯了,还有别的东西在那里,我看不见?

这是计算器的完整代码。

这是库std_lib_facilities.h

你没疯。

出版的书有bug并不是闻所未闻的。通常情况下,一本书的相应网站会有一个在线的"勘误表",其中包含下一次印刷所需的所有更正。

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

我没有看到第7章的任何内容。但是如果你确定你发现了一个bug,一定要给他发邮件。他有可能会回复你并谢谢你。

我认为你的代码块只有轻微的bug,因为这一行:

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
}