中断是退出循环的最有效方法吗?在下面的代码段中,行A或行B是退出循环的更有效方法吗?任何有关中断指示如何在引擎盖下工作的材料的链接都将受到赞赏。
for (int i = 0; i < 10; i++) {
cout << i << endl;
if (i == 3) {
break;// A
i = 15; // B
}
}我认为差异在大多数情况下都是微不足道的,并且A更快,因为B需要先分配,递增然后进行比较,但是我实际上不知道break是如何工作的,比知道更好。谢谢!
让我们编译以下代码并查看程序集:
#include <stdio.h>int loop_with_break() {
for (int i = 0; i < 10; i ++) {
puts("Hello, world!");
if (i == 3) {
break;
}
}}int loop_with_assignment() {
for (int i = 0; i < 10; i ++) {
puts("Hello, world!");
if (i == 3) {
i = 10;
}
}}int main() {
loop_with_break();
loop_with_assignment();}
如您所见,当使用时break,如果使用,i == 3它将直接跳出循环到函数的结尾,而如果使用i = 10,它将设置i为10,将其增加1,然后进行比较,比较慢 但是,此编译没有进行任何优化。如果使用优化,则它们最终都会变成同一件事。但是,由于break更具可读性并且不能保证这些优化,因此应使用它来打破循环。
关键字break将仅退出循环而无需在循环条件中进行任何比较。如果使用i = 15语法,则循环将在下一次迭代以验证变量i是否大于10,如果大于10,则退出。
简而言之,break将在不考虑任何事情的情况下中断循环,而i = 15将导致再进行一次迭代以查看条件是否满足要求。
你是对的!实际上break关键字对于打破循环来说是非常快的!
在您的示例中,如果使用A行,则控制到达此语句后,它将立即中断循环。
另一方面,如果您使用行B,则将首先执行分配,然后控件将再次进入条件检查,当条件变为假时,它将退出循环!