C语言从入门到实战(三):控制语句

类型

控制语句大体上可以分为以下几类:

不同的教程对语句的分类有所不同,这里按我自己的理解来,有不同的想法欢迎到评论区交流

注意:C 语言的语句执行顺序是从 main() 函数开始,从上到下,依次逐行执行

选择语句

选择语句帮助程序根据不同的条件或值做出决策,从而控制程序的执行流。

  • if

    1
    2
    3
    4
    5
    6
    
    ...
    if (conditional)
    {
      // 语句块
    }
    ...
    

    条件表达式 conditional 必须是整数类型或可以被转换为整数的类型。

    如果 conditional 的值为0,则表示 false,语句块不会被执行。

    如果 conditional 的值非0,则表示 true,语句块将被执行。

  • if-else if

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    ...
    if (conditional1)
    {
      // 语句块1
    } else if (conditional2)
    {
      // 语句块2
    }
    ...
    

    如果 conditional1 的值为 true,则执行语句块1。执行完毕后,整个 if-else if 结构将结束,即使 conditional2 的值也为 true。 如果 conditional1 的值为 false,则继续判断 conditional2, 如果 conditional2 的值为 true,则执行语句块2。 如果 conditional2 也为 false,则继续检查后续的条件(如果有的话)。

  • if-else

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    ...
    if (conditional)
    {
      // 语句块1
    } else
    {
      // 语句块2
    }
    ...
    

    如果 conditional 的值为 true,则执行语句块1,否则执行语句块2。 与 if-else if 的区别在于,if-else 只能有两个语句块,其中一个必定被执行。 if-else 语句也可以与 if-else if 组合,但需要注意的是,if-else 语句必须位于整个 if-else if 结构的最后。

  • switch-case

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
    ...
    switch (expression) {
      case x:
        // 代码块1
        break;
      case y:
        // 代码块2
        break;
      default:
        // 代码块3
    }
    ...
    

    switch-case 语句用于基于某个表达式的值选择执行的代码块。 case 标签类似于 if-else if,用于匹配 expression 的值。 default 标签类似于 else,在没有匹配的 case 时执行。 有些教程将 switch 单独列为 分支语句,而为了便于理解,这里将其与 if-else if 结合。 他们之间的区别可以参考 switch和if else的比较 这篇文章。TODO:验证这篇文章,探究底层原理,性能测试

循环语句

循环语句允许程序重复执行某段代码,直到满足指定条件,从而实现自动化和简化代码的执行。

  • for

    1
    2
    3
    4
    5
    6
    
    ...
    for (expression1; expression2; expression3)
    {
      // 代码块
    }
    ...
    

    执行顺序如下:

    1. 执行 expression1,初始化循环变量,一般用 i 表示。在一个 for 循环中,expression1 只会被执行一次。
    2. 执行 expression2 条件表达式。如果结果为 true,则运行代码块中的语句。记住,从上到下,依次逐行执行。如果代码块中包含另一个 for 循环,它会被视为一个整体,直到执行完毕。
    3. 执行 expression3,更新循环变量,然后回到第2步,继续循环,直到 expression2 的结果为 false,此时整个 for 循环结束。

    for 循环的写法不必完全按照上述格式,需要注意的地方是:

    • expression1 可以省略,但循环变量必须在 for 循环开始前初始化,这是 expression2 正确执行的前提。
    • expression2 必须 在某个时刻返回 false,以确保循环能够终止。
    • expression3 可以放在代码块中执行,但不能省略或不更新循环变量,否则可能导致 for 循环一次也不执行或出现 死循环
    • for 循环的三部分都可以为空,但不能遗漏了 ;,例如:for (;;) { // 无限循环}。这种用法通常用于需要无限次循环的情况,但要确保有适当的退出机制。
    • 对于嵌套的 for 循环,确保每个循环变量都有明确的作用域,并注意避免逻辑混淆和性能问题。

跳转语句