循环:在构造函数中使用中断或状态变量

Loops: Use break or state variable in constructor

本文关键字:中断 状态 变量 构造函数 循环      更新时间:2023-10-16

我朋友的教授正在教授一门入门C++课程,并建议不要使用中断语句。例如:

for (int i = 0; input != 'Q'; i++) {
    cin >> input;
    chararray[i] = input;
}

比显式 if 检查更好:

if (input == 'Q')
    break;

我不熟悉C++标准,但这种隐式循环终止对我来说似乎很尴尬,因为我来自 Python 背景。在循环构造函数中还是在显式条件块中循环终止符更好?

无论教授说什么,循环

for (int i = 0; input != 'Q'; i++) {
    cin >> input;
    chararray[i] = input;
}

是狗屎!(如果上面的代码是由教授编写的,我很乐意与该教授讨论这个问题)问题是即使输入失败,也会使用输入!阅读后,您始终需要检查阅读是否成功,例如,

for (int i = 0; std::cin >> input && input != 'Q'; ++i) {
    chararray[i] = input;
}

顺便说一句,尽管C++语言的名称,但递增对象的惯用方法是使用预递增,即为了匹配惯用法,该语言应该被称为++C。

关于实际问题:我倾向于不使用break;语句来拯救循环,而是使用循环条件。主要原因是我认为它有助于提高可读性。但是,这样做并不总是那么容易。当然,我不认为人们应该编写循环,除非他们正在实现新算法,但这完全是一个单独的主题。

绝对是情境。有时break可能会简化循环。但总的来说,我同意教授的观点,即语言为循环条件分配的位置应该是循环的唯一条件...... for(; condition;)while(condition)等。

此外,更好的设置和循环可能是使chararray成为vector<char>,如果适用的话,甚至是string

for(char input; std::cin >> input && input != 'Q';)
    v.push_back(input);

或者,如果需要实际数组,则应检查i以免在条件中溢出数组的大小。

在更大更复杂的循环中使用中断/继续通常会使下一个人更难阅读循环。因此,如果你的循环有一个简单的谓词,可以很容易地进入循环条件,这通常是编写它的最佳方式。

此外,在块中if(cond)break而不是for(...; (cond); ...)的一个原因是,您可能需要测试在完成的事情之间进行,例如读取变量和使用该变量,这可能适用于此代码。

如果你的教授自己问这个问题会更好。至于您的示例,它包含一个逻辑错误。第一个循环在字符数组中写入字符"0"

for (int i = 0; input != 'Q'; i++) {
    cin >> input;
    chararray[i] = input;
}

虽然似乎第二个带有中断的循环不会在数组中写入字符"0"。

is better than having an explicit if check:
if (input == 'Q')
    break;

我会使用 while 循环。例如

size_t i = 0;
while ( i + 1 < N && std::cin >> input && input != '0' )
{
   chararray[i] = input;
   i++;
}
chararray[i] = '';

甚至作为

while ( i + sizeof( '' ) < N && std::cin >> input && input != '0' )

顺便说一句,我写了一篇关于false_predicate和true_predicate的文章。也许会很有趣。虽然它是用俄语写的,但它可以使用例如谷歌翻译的服务翻译成英语。

http://cpp.forum24.ru/?1-3-0-00000066-000-0-0-1380811383