我朋友的教授正在教授C ++入门课程并建议不要使用break语句。例如:
for (int i = 0; input != 'Q'; i++) {
cin >> input;
chararray[i] = input;
}
比明确检查更好:
if (input == 'Q')
break;
我不熟悉C ++标准,但这种隐式循环终止对我来说似乎很难从Python背景出来。在循环构造函数中或在显式条件块中循环终止符是否更好?
答案 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)
等等。
此外,更好的设置&如果适用,循环可能会使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的文章。也许它会很有趣。虽然它是用俄语写的,但它可以用英语翻译,例如使用谷歌翻译服务。