首先先講解下for循環語句的工作原理
for語句的語法格式為:
for(表達式1;表達式2;表達式3)
for語句有循環初始和循環控制功能,語句形式為:
for語句的說明:
- 整個循環過程中表達式1只求解1次;作用是給循環控制變量賦初值
- 表達式2相當於是for的循環條件
- 表達式3是重復執行的內容;通常是改變循環控制變量值的語句
for語句的應用格式:
for (循環初始; 循環條件; 循環控制) { 循環體; }
如:求1 + 2 + 3 + … + 100
for (int n = 1, sum = 0; n <= 100; n++) sum = sum + n;
等同於
int n = 1, sum = 0; while (n <= 100) { sum = sum + n; n = n + 1; }
省略表達式1
int n = 1, sum = 0; for ( ; n <= 100; n++) sum = sum + n;
省略表達式3
for (int n = 1, sum = 0; n <= 100; ) sum = sum + n; n++;
表達式1和表達式3都省略
int n = 1, sum = 0; for ( ; n <= 100; ) sum = sum + n; n++;
為什么for循環中循環變量在條件判斷式即表達式2中不能亂用
假設我們要輸出一個二維數組,並且加上控制條件,僅輸出行、列值不相等的數組元素,那么你判斷一下下面的程序對嗎?(類似功能,並不輸出一個二維數組,重點在循環控制上)
/**C和C++一樣,這里以C++為例*/ int main () { int n; cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; (j < n) && (j != i); j++) { cout << "執行:"; cout << '[' << i << ']' << '[' << j << ']'; } cout << endl; } return 0; }
以輸入3為例 3 執行[1][0] 執行[2][0]執行[2][1] ---------------程序結束
那么僅輸出行、列值相等數組元素呢?
int main () { int n; cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; (j < n) && (j == i); j++) { cout << "執行:"; cout << '[' << i << ']' << '[' << j << ']'; } cout << endl; } return 0; }
以輸入3為例 3 執行[0][0] ---------------程序結束
並沒有達到我們預期的功能,在第一種情況下,在行、列值相等時就跳過了第二個for循環的后續執行;在第二種情況下,在行、列值不相等時就跳過了第二個乃至第一個for循環的后續執行。如果我們的代碼中出現了這種條件判斷語句,那是相等嚴重的,並且還不易察覺這里出問題了。
原因就是在第二個for循環中,當循環條件(即表達式2)不成立時,便跳出了第二個循環。也就是說表達式2主要起到一個遍歷的作用,而對於一些具體的條件判斷應該放在循環體中進行,這樣就能夠不影響到循環的遍歷
最后的總結就是
如果需要對遍歷過程進行控制,那么可以在for循環的條件判斷式(表達式2)上進行限定。比如輸出一個台階型的圖案:
for (int i = 0; i < n; i++) { for (int j = 0; j <= i; j++) { cout << '*'; } cout << endl; }
以n = 5為例
*
**
***
****
*****
如果需要在遍歷過程中對具體操作對象進行控制,而不是對遍歷過程進行控制,那么需要在循環體中進行限定。比如,上面的第一種情況:
for (int i = 0; i < n; i++) { for (int j = 0; (j < n); j++) { if (i != j) { cout << "執行:"; cout << '[' << i << ']' << '[' << j << ']'; } } cout << endl; }
以輸入3為例 3 執行[0][1]執行[0][2] 執行[1][0]執行[1][2] 執行[2][0]執行[2][1]