循环:在构造函数中使用break或state变量

时间:2014-01-12 22:36:10

标签: c++ coding-style standards

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

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

比明确检查更好:

if (input == 'Q')
    break;

我不熟悉C ++标准,但这种隐式循环终止对我来说似乎很难从Python背景出来。在循环构造函数中或在显式条件块中循环终止符是否更好?

4 个答案:

答案 0 :(得分:2)

无论教授说什么,循环

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;
}
BTW,尽管语言的名称是C ++,但是增加对象的惯用方法是使用preincrement,即,为了匹配惯用语,该语言应该被称为++ C.

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

如果你的教授会自己提出这个问题,那会更好。至于你的例子,它包含一个逻辑错误。第一个循环在chararray

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

虽然看起来第二个带有break的循环不会在数组中写入字符'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] = '\0';

甚至是

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

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

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