C ++是否有任何类型的实用程序在函数调用后返回函数的开头?例如,在calculate函数中调用help()。
void help()
{
cout << "Welcome to this annoying calculator program.\n";
cout << "You can add(+), subtract(-), multiply(*), divide(/),\n";
cout << "find the remainder(%), square root(sqrt()), use exponents(pow(x,x)),\n";
cout << "use parentheses, assign variables (ex: let x = 3), and assign\n";
cout << " constants (ex: const pi = 3.14). Happy Calculating!\n";
return;
}
void clean_up_mess() // purge error tokens
{
ts.ignore(print);
}
const string prompt = "> ";
const string result = "= ";
void calculate()
{
while(true) try {
cout << prompt;
Token t = ts.get();
if (t.kind == help_user) help();
else if (t.kind == quit) return;
while (t.kind == print) t=ts.get();
ts.unget(t);
cout << result << statement() << endl;
}
catch(runtime_error& e) {
cerr << e.what() << endl;
clean_up_mess();
}
}
虽然技术上我的帮助功能的实现工作正常,但它并不完美。在调用帮助并返回之后,它继续尝试cout&lt;&lt;结果&lt;&lt; statement()&lt;&lt; ENDL;这是不可能的,因为没有输入任何值。因此,它给出了一个小错误消息(程序中的其他地方),然后继续该程序。没有功能问题,但它很难看,我不喜欢它(:P)。
那么有什么方法可以帮助函数返回,返回到计算的开始并重新开始? (我在if(t.kind == help_user)块中插入一个函数调用来调用calculate,但是我认为这只会延迟问题而不是解决问题。)
答案 0 :(得分:5)
这可能就是你要找的东西?
if (t.kind == help_user) {
help();
continue;
}
答案 1 :(得分:5)
你可以使用goto,但是当你这样做时,请考虑自己。它被认为是不好的做法,它的良好用途是罕见的,相距甚远。
我认为您正在寻找的是:
void do_calculate(void)
{
while (true)
{
cout << prompt;
Token t = ts.get();
if (t.kind == help_user)
{
help();
continue; // <- here
}
else if (t.kind == quit)
{
return;
}
while (t.kind == print)
{
t = ts.get();
}
ts.unget(t);
cout << result << statement() << endl;
}
}
void calculate()
{
try
{
do_calculate();
}
catch (const std::exception& e)
{
cerr << e.what() << endl;
clean_up_mess();
}
}
我还重新格式化了你的代码。我认为这对他自己来说更具可读性,但只是想让你进行比较。
try / catch子句现在不再干扰计算功能。
'if'语句使用括号表示一致性。此外,它更容易阅读,因为我知道无论控制是否在这些括号内。
catch将捕获std :: exception,而不是runtime_error。所有标准异常都继承自std :: exception,因此通过捕获,您知道可以捕获任何内容。
答案 2 :(得分:2)
您可以使用continue
语句返回循环的顶部。这是实现所需内容的最简单方法,因为您的代码周围有while
循环:
if (t.kind == help_user) {
help();
continue;
}
还有goto
声明,但这几乎总是一个坏主意。我会把它留给你自己阅读。有关“控制流程”的更多信息,请阅读。
在这个特定的例子中,我可能会选择通过添加else
语句来稍微重构您的代码,如下所示:
if (t.kind == help_user)
help();
else if (t.kind == quit)
return;
else {
while (t.kind == print)
t=ts.get();
ts.unget(t);
cout << result << statement() << endl;
}
答案 3 :(得分:1)
是的,它被称为逻辑:
void calculate()
{
while(true)
{
try {
cout << prompt;
Token t = ts.get();
if (t.kind == help_user)
help();
else
{
if (t.kind == quit) return;
while (t.kind == print) t=ts.get();
cout << result << statement() << endl;
}
ts.unget(t); // if statement above needs this then leave it in and
// add one call after help() as well ... not sure from code
}
catch(runtime_error& e) {
cerr << e.what() << endl;
clean_up_mess();
}
}