循环:在构造函数中使用中断或状态变量
Loops: Use break or state variable in constructor
我朋友的教授正在教授一门入门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
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- std::future_error:无关联状态
- 类成员和中断
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 我的代码运行良好,但在游戏循环中中断
- 使用带有MCP23017的 pigpio 进行中断读取
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 为什么我在 AVR 中的中断无法正常工作?
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 使用 UDP 中断 while()-循环
- 循环:在构造函数中使用中断或状态变量