休息的替代方法?

Alternative to break?

本文关键字:方法      更新时间:2023-10-16

我对 c++ 很陌生,我被告知不要使用"break"语句。我很好奇"休息"有哪些替代方案?(使用下面的代码示例)

void remove_comments( ifstream& fileIn , ofstream& fileOut)
{
string line;
bool flag = false;
bool found = false;
while (! fileIn.eof() )
{
getline(fileIn, line);
if (line.find("/*") < line.length() )
flag = true;
if (! flag)
{
for (int i=0; i < line.length(); i++)
{
if(i<line.length())
if ((line.at(i) == '/') && (line.at(i + 1) == '/'))
break;
else
fileOut << line[i];
}
fileOut<<endl;

}
if(flag)
{
if(line.find("*/") < line.length() )
flag = false;
}
}
}

在我看来,使用break是完全可以的,但如果你的任务是在没有它的情况下完成工作,那么让我们在没有它的情况下完成这项工作。同样的问题可以通过使用几个不同结构的代码片段来解决,这些代码片段使用与C++不同的控制流语句。这个问题也可以在没有break的情况下解决。我建议你将函数分解为一个中心函数和几个帮助程序函数。由于我不想代替您解决问题,因此我只是通过说明和一些"伪代码"之类的东西来提供帮助。

您有一个输入文本,该文本依次由已注释和未注释的部分组成。您希望在循环中执行以下操作:

// I refer to non-commented text as "writable"
writable_begin = 0
while (writable_begin < text_len)
{
writable_end, comment_type = find_next_comment_begin(writable_begin);
write_out_text(writable_begin, writable_end);
if (comment_type == singleline)
writable_begin = find_singleline_comment_end(writable_end);
else
writable_begin = find_multiline_comment_end(writable_end);
}

您必须了解如何实现我在伪代码中使用的辅助函数/方法,它们可以轻松实现而不会中断。如果使用帮助程序函数解决问题,则还可以获得比当前使用复杂控制流语句的意大利面条代码更好的解决方案。许多错误可以很容易地隐藏在这样的代码中。

提示: 您的帮助程序函数将在循环中搜索注释文本的末尾,但您可以简单地使用return退出带有结果的帮助程序函数,而不是break

你可以重写循环

for (int i=0;
i < line.length() &&
!(i+1 < line.length() && (line.at(i) == '/') && (line.at(i + 1) == '/'));
++i)
{
fileOut << line[i];
}
fileOut<<endl;

打破有时是必要的 - 没有休息,你可能会撞到前面的东西并伤害自己。

你也可能因为思考不善,然后以一种神秘的方式解决问题而伤害自己,即使你在 6 个月后也不会理解。

最后——谁告诉你不要使用"休息时间"......给他一个休息时间——永远不要停下来向他/她/它寻求建议。

顺便说一句 - 处理你的缩进和卷曲 - 不好。

你可以 -而且应该 - 重写该循环。Mankarse展示了一个选项,但for循环中存在所有那些奇怪且难以理解的条件。

您应该学会利用标准库的强大功能。例如,此代码将从存储在line中的字符串中删除C++样式行注释后面的所有字符:

// Find the first instance of two forward slashes in the line
// and return an iterator to that.
auto begin_comment = line.find("//");
// We found it! Remove all characters from that point on
if (begin_comment != std::string::npos)
line.erase (begin_comment, line.end());
fileOut << line << std::endl;

考虑如何也可以获取这样的小块代码并将它们放入函数中,您将调用这些函数来代表您执行工作。这不仅会使代码更具可读性,而且会让您养成设计界面的习惯,这是一项非常重要的技能。


作为旁注,您的缩进真的很糟糕,您必须对其进行处理。看看这个宝石:

for (int i=0; i < line.length(); i++)
{
if(i<line.length())
if ((line.at(i) == '/') && (line.at(i + 1) == '/'))
break;
else
fileOut << line[i];
}

else与这两个if陈述中的哪一个相匹配?你是否立即完全确定你是对的?

可以肯定的是,编译器不需要缩进,也毫不在乎它。但是你这样做了,你很快就会发现,随着你的代码变得越来越复杂,除非它被正确缩进,否则它将无法理解。