break 语句是否跳出多个循环?

Does the break statement break out of multiple loops?

如果我在另一个 while 循环 (b) 中有一个 while 循环 (a) 并且我在 'b' 循环中使用 break 语句,它是否也跳出了 'a' 循环还是留在 'a' 循环中?

Does the break statement break out of multiple loops?

No:

A break statement terminates execution of the smallest enclosing switch or iteration statement.

Documentation on the break statement:

Causes the enclosing for, while or do-while loop or switch statement to terminate.

封闭语句,单数。

它突破了包含它的最内层循环

https://beginnersbook.com/2014/01/c-break-statement/

  for(int i = 0; i < 10; i++){
      int x = foop();
      nargel();
      for (int j = 0; j < 20; j++){
         int k = fringle(i,j);
         if(are_we_done_yet(k))
            break; <<<<<<<<<<<<<<====== this goes
      }
      blink(); <<<<<<<<<<<<===== here
   }

有些语言允许您通过给 for 一个标签来说明要跳出哪个循环,但 c 不行。 Java 例如 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html

关键字break只对当前循环起作用。您不能使用单个 break 打破任何封闭循环中的最外层循环,您需要设置一个标志以便在每个循环开始时在它变为 non-null 时中断。 如果您还在同一循环级别中使用 continue 和多个 break/continue,它会变得更加棘手,但可以做到。

示例:

int must_break = 0 ;
...
...
for (int l1=0;l1<LIMIT1;l1++) {
  ...
  ...
  for (int l2=0;l2<LIMIT2;l2++ {
    ...
    ...
    for (int l3=0;l3<LIMIT3;l3++ {
      ...
      ...
      if (INTERNAL_BREAK_CONDITION) {
        // This flag will cause all outer loops to break instantly in cascade.
        must_break = 1 ;
        break ;   // Break L3
      }
    }
    // Must be placed just after the possibly breaking loop.
    if (must_break)   // Break L2
      break ;
  }
  // Must be placed just after the possibly breaking loop.
  if (must_break)   // Break L1
    break ;
}
// Here, you can test: if "must_break" is non-null, then a break occurred.
if (must_break)
  printf("Break detected!\n");

或者你可以在地狱给自己买一个温暖的地方,然后使用 goto 来打破所有循环......但显然,除了汇编程序之外,大多数编程语言都非常糟糕地考虑它。在 C 中,在 low-level 驱动程序/内核模块之外,无论发生什么,它通常都是“no-go”。但它有效...它不可维护,但它有效。

break; 仅从它出现的最内层循环或 switch 主体中断。

如果您打算打破嵌套循环,您可以考虑将嵌套循环移动到一个单独的函数中,并使用 return 从函数体内的任何点退出函数。

示例:

    ...
    int matrix[ROWS][COLS];
    int value;
    ...
    int found = 0;
    for (int row = 0; row < ROWS; row++) {
        for (int col = 0; col < COLS; col++) {
            if (matrix[row][col] == value) {
                found = 1;
                break;
            }
        }
        if (found)
            break;
    }
    ...

可以简化为:

int hasvalue(int matrix[ROWS][COLS], int value) {
    for (int row = 0; row < ROWS; row++) {
        for (int col = 0; col < COLS; col++) {
            if (matrix[row][col] == value)
                return 1;
        }
    }
    return 0;
}

    ...
    int matrix[ROWS][COLS];
    int value;
    ...
    found = hasvalue(matrix, value);
    ...