C++ 中的巢狀迴圈
本文將介紹如何在 C++ 中使用不同的巢狀迴圈。
在 C++ 中使用巢狀的 for
迴圈初始化二維矩陣
迴圈被稱為控制流語句,它通常修改程式計數器並強制執行 CPU 移動到程式中的不同(通常是一個非連續的)指令。程式計數器是 CPU 核心中的一個暫存器,用於儲存正在執行的程式的下一條指令。
讓我們考慮程式的組合語言級表示,其中每條語句對應一條機器指令。程式碼按順序執行,除非另有指示,否則 CPU 會獲取下一條指令(鬆散地說,因為當代 CPU 核心是大規模優化的機器,可以獲取多條指令,並且通常從程式中的非順序位置獲取)。所以,如果我們想實現一個迴圈,我們需要在組合語言中用特殊指令指示將執行轉移到程式的不同部分。
現在,讓我們考慮 C++ 語言語法以及如何實現不同的控制流語句,如迴圈。
程式語言中最常見的迴圈語句之一是 for
和 while
迴圈。for
迴圈的頭部分包括三部分語句並控制迴圈體的執行。多個 for
迴圈語句可以相互巢狀,為許多程式設計任務形成一個有用的結構。
本文演示了使用巢狀 for
迴圈初始化二維矩陣的示例。每個巢狀迴圈級別處理矩陣的一行,因此在此示例中我們有兩個級別。請注意,我們還在將隨機整數分配給給定位置後列印元素。後面的步驟將在實際場景中單獨完成,但此程式碼示例僅用於教育目的。
#include <iostream>
#include <iomanip>
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
主體之外宣告索引變數 i
和 j
,並且只在同一範圍內初始化它們中的一個。
請注意,第二個變數 y
- 對應於矩陣的列位置,在外部 while
迴圈的每個迴圈中都被初始化為 0
。這確保在處理第一行之後執行內部迴圈。我們還應該在各自的迴圈範圍內為每個索引變數放置遞增語句,因為 while
本身只有控制迭代的條件頭。
#include <iostream>
#include <iomanip>
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 <iostream>
#include <iomanip>
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;
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn