中断是退出循环的最有效方法吗?在下面的代码段中,行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,则将首先执行分配,然后控件将再次进入条件检查,当条件变为假时,它将退出循环!