zoukankan      html  css  js  c++  java
  • 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]
  • 相关阅读:
    oracle问题之死锁 (一)
    linux下oracle调试小知识
    Oracle实例名,服务名等概念区别与联系
    oracle 数据库、实例、服务名、SID
    Linux下启动/关闭Oracle
    Oracle监听器
    Oracle数据库、实例、用户、表空间、表之间的关系
    在Centos7上安装Oracle
    理财入门书籍
    [C/C++] VS 2015 C++ 插件
  • 原文地址:https://www.cnblogs.com/MK-XIAOYU/p/12707033.html
Copyright © 2011-2022 走看看