C++ 中的嵌套循环

Jinku Hu 2023年10月12日
  1. 在 C++ 中使用嵌套的 for 循环初始化二维矩阵
  2. 在 C++ 中使用嵌套的 while 循环初始化二维矩阵
  3. 在 C++ 中使用嵌套的 do...while 循环初始化二维矩阵
C++ 中的嵌套循环

本文将介绍如何在 C++ 中使用不同的嵌套循环。

在 C++ 中使用嵌套的 for 循环初始化二维矩阵

循环被称为控制流语句,它通常修改程序计数器并强制执行 CPU 移动到程序中的不同(通常是一个非连续的)指令。程序计数器是 CPU 内核中的一个寄存器,用于存储正在运行的程序的下一条指令。

让我们考虑程序的汇编语言级表示,其中每条语句对应一条机器指令。代码按顺序执行,除非另有指示,否则 CPU 会获取下一条指令(松散地说,因为当代 CPU 内核是大规模优化的机器,可以获取多条指令,并且通常从程序中的非顺序位置获取)。所以,如果我们想实现一个循环,我们需要在汇编语言中用特殊指令指示将执行转移到程序的不同部分。

现在,让我们考虑 C++ 语言语法以及如何实现不同的控制流语句,如循环。

编程语言中最常见的循环语句之一是 forwhile 循环。for 循环的头部分包括三部分语句并控制循环体的执行。多个 for 循环语句可以相互嵌套,为许多编程任务形成一个有用的结构。

本文演示了使用嵌套 for 循环初始化二维矩阵的示例。每个嵌套循环级别处理矩阵的一行,因此在此示例中我们有两个级别。请注意,我们还在将随机整数分配给给定位置后打印元素。后面的步骤将在实际场景中单独完成,但此代码示例仅用于教育目的。

#include <iomanip>
#include <iostream>

using std::cout;
using std::endl;
using std::setw;

constexpr int ROW = 4;
constexpr int COL = 3;

int main() {
  int *matrix = new int[ROW * COL];

  for (int i = 0; i < ROW; ++i) {
    for (int j = 0; j < COL; ++j) {
      matrix[j * ROW + i] = rand() % 100;
      cout << setw(2) << matrix[j * ROW + i] << "; ";
    }
    cout << endl;
  }

  delete[] matrix;

  return EXIT_SUCCESS;
}

输出:

83; 86; 77;
36; 93; 35;
86; 92; 14;
22; 62; 27;

在 C++ 中使用嵌套的 while 循环初始化二维矩阵

或者,我们可以使用嵌套的 while 循环语句来实现前面的代码。在这个变体中,我们需要在 while 主体之外声明索引变量 ij,并且只在同一范围内初始化它们中的一个。

请注意,第二个变量 y - 对应于矩阵的列位置,在外部 while 循环的每个循环中都被初始化为 0。这确保在处理第一行之后执行内部循环。我们还应该在各自的循环范围内为每个索引变量放置递增语句,因为 while 本身只有控制迭代的条件头。

#include <iomanip>
#include <iostream>

using std::cout;
using std::endl;
using std::setw;

constexpr int ROW = 4;
constexpr int COL = 3;

int main() {
  int *matrix = new int[ROW * COL];

  int j, i = 0;
  while (i < ROW) {
    j = 0;
    while (j < COL) {
      matrix[j * ROW + i] = rand() % 100;
      cout << setw(2) << matrix[j * ROW + i] << "; ";
      j++;
    }
    i++;
    cout << endl;
  }

  delete[] matrix;

  return EXIT_SUCCESS;
}

输出:

83; 86; 77;
36; 93; 35;
86; 92; 14;
22; 62; 27;

在 C++ 中使用嵌套的 do...while 循环初始化二维矩阵

另一方面,C++ 语言也有 do...while 循环结构,它适用于迭代的特殊情况,但我们可以使用它重写相同的代码片段。

do...while 语句总是执行第一次迭代。所以,这个例子不会受到这个特性的影响,因为我们假设生成的矩阵至少有 1x1 维度。

do...while 循环结构与上面的 while 示例几乎相同,因为这两个具有相似的标题格式,其中仅包含条件表达式。

#include <iomanip>
#include <iostream>

using std::cout;
using std::endl;
using std::setw;

constexpr int ROW = 4;
constexpr int COL = 3;

int main() {
  int *matrix = new int[ROW * COL];

  int j, i = 0;
  do {
    j = 0;
    do {
      matrix[j * ROW + i] = rand() % 100;
      cout << setw(2) << matrix[j * ROW + i] << "; ";
      j++;
    } while (j < COL);
    i++;
    cout << endl;
  } while (i < ROW);

  delete[] matrix;

  return EXIT_SUCCESS;
}

输出:

83; 86; 77;
36; 93; 35;
86; 92; 14;
22; 62; 27;
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C++ Loop