作者的代码是否正确? - 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
}
但据我所知,这段代码无法生成这样的输出,并且可以像这样工作,
- 读取令牌
- 如果是退出或者打印一些值,就执行,否则就放那个
令牌返回 Token_stream.
- 然后,计算一个表达式的值(假设有
用户输入的表达式)。如果没有expression/token可读取,程序只是等待输入(在
primary()
函数中)。
- 表达式求值后,转到步骤 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
}
我正在使用 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
}
但据我所知,这段代码无法生成这样的输出,并且可以像这样工作,
- 读取令牌
- 如果是退出或者打印一些值,就执行,否则就放那个 令牌返回 Token_stream.
- 然后,计算一个表达式的值(假设有
用户输入的表达式)。如果没有expression/token可读取,程序只是等待输入(在
primary()
函数中)。 - 表达式求值后,转到步骤 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
}