C/C++for循環中循環變量在條件判斷式中千萬不要亂用


首先先講解下for循環語句的工作原理

for語句的語法格式為:

for(表達式1;表達式2;表達式3)

for語句有循環初始和循環控制功能,語句形式為:

 

 

for語句的說明:

  1. 整個循環過程中表達式1只求解1次;作用是給循環控制變量賦初值
  2. 表達式2相當於是for的循環條件
  3. 表達式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]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM