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

扫描二维码关注公众号,回复: 10825612 查看本文章
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循环语句其实是实现了两个while循环语句的功能

第一种情况

int main ()
{
    int n;
    cin >> n;
    int i = 0;
    while (i < n) {
        int j = 0;
        while (j < n && j != i) {
            cout << "执行[" << i << ']' << '[' << j << ']';
            j++;
        }
        cout << endl;
        i++;
    }
    return 0;
}

当行、列值相等时,循环体执行不到并且 j 的值也不在增加,这样结果就输出了

3

执行[1][0]
执行[2][0]执行[2][1]
---------------程序结束

第二种情况

int main ()
{
    int n;
    cin >> n;
    int i = 0;
    while (i < n) {
        int j = 0;
        while (j < n && j == i) {
            cout << "执行[" << i << ']' << '[' << j << ']';
            j++;
        }
        cout << endl;
        i++;
    }
    return 0;
}

当行、列值不相等时,循环体执行不到并且 j 的值也不在增加,这样结果就输出了

3
执行[0][0]


---------------程序结束

最后的总结就是

如果想在条件判断中使用两个循环控制变量,那么可以把判断条件提到循环体内,比如第一种情况:

for (int i = 0; i < n; i++) {
    for (int j = 0; (j < n); j++) {
        if (i == j) {
            cout << "执行:";
            cout << '[' << i << ']' << '[' << j << ']';
        }
    }
    cout << endl;
}

这样即可实现预期功能。

猜你喜欢

转载自www.cnblogs.com/MK-XIAOYU/p/12707033.html