☀️光天化日学C语言☀️(30)- for 语句 | 子子孙孙无穷尽也

Posted 英雄哪里出来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了☀️光天化日学C语言☀️(30)- for 语句 | 子子孙孙无穷尽也相关的知识,希望对你有一定的参考价值。

🙉饭不食,水不饮,题必须刷🙉

C语言免费动漫教程,和我一起打卡!
🌞《光天化日学C语言》🌞

LeetCode 太难?先看简单题!
🧡《C语言入门100例》🧡

数据结构难?不存在的!
🌳《数据结构入门》🌳

LeetCode 太简单?算法学起来!
🌌《夜深人静写算法》🌌

究极算法奥义!深度学习!
🟣《深度学习100例》🟣

一、前言

  本文作者是从 2007 年开始学 C语言 的,不久又接触了C++,基本就是 C/C++ 技术栈写了 14 年的样子,不算精通,但也算差强人意。著有《夜深人静写算法》系列,且承诺会持续更新,直到所有算法都学完。主要专攻 高中 OI 、大学 ACM、 职场 LeetCode 的全领域算法。由于文章中采用 C/C++ 的语法,于是就有不少读者朋友反馈语言层面就被劝退了,更何况是算法。
  于是,2021 年 06 月 12 日,《光天化日学C语言》 应运而生。这个系列文章主要服务于高中生、大学生以及职场上想入坑C语言的志同道合之人,希望能给祖国引入更多编程方面的人才,并且让自己的青春不留遗憾!
  这一章的主要内容是 一种循环结构,for 循环语句。

二、人物简介

  • 第一位登场的就是今后会一直教我们C语言的老师 —— 光天。
  • 第二位登场的则是今后会和大家一起学习C语言的没什么资质的小白程序猿 —— 化日。

三、for 语句简介

  • 对于循环结构,除了 while 语句以外,还有 for 语句。

1、语法规则

  • for 语句的一般形式为:
for(循环初始化表达式; 循环条件表达式; 循环执行表达式){
    循环体
}

它的运行过程为:
  1)首先,执行 循环初始化表达式
  2)然后,执行 循环条件表达式,如果它的值为真,则执行循环体,否则结束循环;
  3)接着,执行完循环体后再执行 循环执行表达式
  4)重复执行步骤 2)和 3),直到 循环条件表达式 的值为假,则结束循环。

  • 上面的步骤中,2)和 3)是一次循环,会重复执行,for 语句的主要作用就是不断执行步骤 2)和 3)。执行过程如下图所示:
  • 细心的读者可能会发现,循环体循环执行表达式 其实是可以合并的,是的,的确是这样。在下面的例子中我会讲到。

2、简单应用

  • 接下来,我们就来实现一个最简单的循环语句,求 1 + 2 + 3 + . . . + n 1 + 2 + 3 + ... + n 1+2+3+...+n 的值。
#include <stdio.h>

int main() {
    int n, i;
    int sum;
    while(scanf("%d", &n) != EOF) { // (1)
        sum = 0;                    // (2)
        for(i = 1; i <= n; ++i) {   // (3)
            sum += i;               // (4)
        }
        printf("%d\\n", sum);        // (5)
    }
    return 0;
} 
  • ( 1 ) (1) (1) 通过输入函数,输入一个数 n n n ,代表求和的上限;
  • ( 2 ) (2) (2) 初始化求和的值为 0;
  • ( 3 ) (3) (3) for 语句三部分:循环初始化表达式:i = 1;循环条件表达式:i <= n;循环执行表达式:++i
  • ( 4 ) (4) (4) 循环体:sum += i;,表示将 1、2、3、4、… 累加到 sum上;
  • ( 5 ) (5) (5) 输出求和sum的值;
  • 以上这段代码,实现了一个数学上的 等差数列 求和。也可以用公式来表示,如下:
  • s u m = ( 1 + n ) n 2 sum = \\frac {(1 + n)n} {2} sum=2(1+n)n
  • 而利用 for 循环,让我们抛开了数学思维,用程序的角度来实现数学问题。

【例题1】给定一个整数 n ( 1 ≤ n ≤ 12 ) n(1 \\le n \\le 12) n(1n12),输出 1 × 2 × 3 × 4 × . . . × n 1 \\times 2 \\times 3 \\times 4 \\times ... \\times n 1×2×3×4×...×n 的值。

四、for 语句中的表达式

  • for 循环中的那个表达式都可以省略,但它们之间的 分号 必须保留。

1、初始化表达式

1)初始化表达式外置

  • 我们可以把 初始化表达式 提到 for 循环外面,如下:
    int i = 1, sum = 0;         // (2)
    for(; i <= n; ++i) {        // (3)
        sum += i;               // (4)
    }
  • 其中注释中的编号对应上文代码中的编号。

2)初始化表达式内置

  • 我们也可以把需要的初始化信息,都在 初始化表达式 内进行赋值,并且用逗号进行分隔,如下:
    int i, sum;                           // (2)
    for(i = 1, sum = 0; i <= n; ++i) {    // (3)
        sum += i;                         // (4)
    }
  • 具体选择哪种方式,是 代码规范 的问题,不在本文进行讨论,都是可以的。

2、条件表达式

  • 如果省略 条件表达式,那就代表这个循环是一个 死循环,如下:
    int i, sum = 0;           // (2)
    for(i = 1;; ++i) {        // (3)
        sum += i;             // (4)
    }
  • 这段代码表示这个循环没有 结束条件,那自然就不会结束了,编码过程中应该尽量避免(当然,某些情况下还是需要的,例如游戏开发中的主循环),或者,函数内部有能够跳出函数的方法,比如 break 关键字。

3、执行表达式

  • 执行表达式 的作用是 让循环条件 逐渐 不成立,从而跳出循环。
  • 当然,它也是可以省略的,因为 循环体 本身也是一个 语句块,也可以达到类似功能,如下代码所示:
    int i, sum = 0;           // (2)
    for(i = 1; i <= n;) {     // (3)
        sum += i;             // (4)
        ++i;
    }
  • 这段代码同样达到了求和的功能,因为 执行表达式 被放入了 循环体,这也正是上文所说的 循环体循环执行表达式 合并的问题。

五、for 语句 类比 while 语句

  • 最后,我们将 for 循环 和 while 循环 进行一个类比。
  • 还是以求和为例,如下代码所示:
#include <stdio.h>

int main() {
    int n, i;
    int sum;
    while(scanf("%d", &n) != EOF) {
        sum = 0;                 
        for(i = 1 /*(1)*/; i <= n/*(2)*/; ++i /*(3)*/) {
            sum += i;               // (4)
        }
        printf("%d\\n", sum);
    }
    return 0;
} 
  • 我们把它用 while 语句来实现,如下:
#include <stdio.h>
int main(){
    int n, i, sum;
    while(scanf("%d", &n) != EOF) {
        sum = 0;
        i = 1;       /*(1)*/ 
        while(i <= n /*(2)*/ ) {
            sum += i;/*(4)*/
            i ++;    /*(3)*/
        }
        printf("%d\\n",sum);        
    }
    return 0;
}
  • ( 1 ) (1) (1) 循环初始化;
  • ( 2 ) (2) (2) 循环条件;
  • ( 3 ) (3) (3) 循环执行;
  • ( 4 ) (4) (4) 循环体;
  • 写成 while 语句以后,更加确定了一件事情,就是 ( 3 ) (3) (3) ( 4 ) (4) (4) 其实是一回事。

通过这一章,我们学会了:
  for 语句的用法;

  • 希望对你有帮助哦 ~ 祝大家早日成为 C 语言大神!

课后习题


🙉饭不食,水不饮,题必须刷🙉

C语言免费动漫教程,和我一起打卡!
🌞《光天化日学C语言》🌞

LeetCode 太难?先看简单题!
🧡《C语言入门100例》🧡

数据结构难?不存在的!
🌳《数据结构入门》🌳

LeetCode 太简单?算法学起来!
🌌《夜深人静写算法》🌌

以上是关于☀️光天化日学C语言☀️(30)- for 语句 | 子子孙孙无穷尽也的主要内容,如果未能解决你的问题,请参考以下文章

☀️光天化日学C语言☀️(29)- while 语句 | 死循环啦!

☀️光天化日学C语言☀️(28)- switch case 语句 | 小孩才做选择,成年人全都要!

☀️光天化日学C语言☀️(34)- 函数进阶 | 面向过程编程

☀️光天化日学C语言☀️(33)- 函数入门 | 开启下一个篇章!

☀️光天化日学C语言☀️(35)- 局部变量和全局变量

☀️光天化日学C语言☀️(32)- continue 关键字 | 下一个!