C++ 停止 for 循环的"best"方法是什么?
C++ What is the "best" way to stop a for loop?
假设您想在c++中创建一个for循环,但是除了确定的条件之外,您还知道循环何时或是否应该停止。注意,这样的条件不一定要硬编码,循环也不应该一直具有这样的决定值。这只是一个示例,可能对随机循环或在运行时确定内容的循环有用。让我们保持这个示例的简单性,并将重点放在一个可以应用于编程中任何此类相关任务的解决方案上。
我想比较这两种解决方案。第一个使用break语句,第二个使用多个或组合条件。就效率或可靠性而言,哪一种是完成任务的"最佳"或"正确"方式。哪一个更不容易出现bug ?我可以提出另一个解决办法。
const int MAX_SIZE = 10;
int myArray[MAX_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// two ways to stop a loop
for (int x = 0; x < MAX_SIZE; x++) {
if (myArray[x] == 7) {
break;
}
cout << myArray[x] << “ “; // fixed
}
for (int x = 0; (x < MAX_SIZE) && (myArray[x] != 7); x++) {
cout << myArray[x] << “ “;
}
首先,循环的行为略有不同-第一个仍然打印数字7
,而另一个则不。
如果你交换了行,这对编译器来说并没有什么区别,两种解决方案将在几乎相同的本机代码中编译。
关于可读性(以及容易出错):这取决于,对于如此简单的规则,将其作为条件的一部分可能会更好,更具可读性。但是,当它变得更复杂时,可能值得引入一些临时变量,然后break
变体更容易阅读。对于更复杂的算法来说,在循环中使用break
是很常见的,甚至是在无限循环中使用break
。
其他人也注意到,这两个方法并不等效,因为一个方法产生的输出多于另一个方法。然而,我猜这只是一个打字错误,你可以通过运行代码来明确地识别它。
出于比较的目的,如果需要使用更多的停止条件(这将比使用一个很长的if更具可读性)或在停止循环之前做其他事情,则第一个更容易推广。例如,您可能希望首先检查myArray[x] == 7
,然后在中断循环之前输出一些东西,这可能是这样做的原因。因此,当代码比较复杂时,第一种方法更好。
在性能方面,这些方法非常相似。
这两个循环不相等。要使第一个循环产生与第二个循环相同的输出(至少对于您指定的数组的内容),您需要将其更改为
for (int x = 0; x < MAX_SIZE; x++)
{
if (myArray[x] == 7)
{
break;
}
cout << myArray[x] << " ";
}
在实践中,大多数人会发现第二种形式更具可读性,因为只有一个明显的结束循环的条件,而不是两个单独的可以终止循环的地方。这是我通常使用的。
事实上,你认为你的形式是等效的,这表明可读性问题正在影响你。所以第二种形式肯定更可取
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 初始化C++向量的"best"方法是什么?
- "Best"从容器中选择k个最小元素的(惯用)方法C++
- C++ 停止 for 循环的"best"方法是什么?
- C++ "Best"参数传递方法