【C生万物】C语言分支和循环语句

简介: 【C生万物】C语言分支和循环语句


1、if语句

if 语句允许程序通过测试表达式的值从两种选项中选择一种。

1.1 if语句的语法格式:

if(表达式)
  语句

表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。

在C语言中,0表示假,非0表示真。也就是表达式的结果如果是0,则语句不执行,表达式的结果如果不是0,则语句执行


1.2 if语句的执行流程

1.3 if …else 语句

语法格式:

1.2 if语句的执行流程
image.png

1.3 if …else 语句
语法格式:

if(

1.4 级联式if语句

编程时常常需要判断一系列的条件,一旦其中某一个条件为真就立刻停止。“级联式”if语句常常时编写这类系列判定的最好方法。

例如:下面这个级联式if语句用来判定n是小于0、等于0、大于0

if(n<0)
    printf("%d小于0\n",n);
else
    if(n==0)
        printf("%d等于0\n",n);
  else
        printf("%d大于0\n",n);


虽然第二个 if 语句式嵌套在第一个if语句内部的。通常不会对他对进行缩进,而是把每个else都与最初的 if 对齐:

if(n<0)
    printf("%d小于0\n",n);
else if(n==0)
    printf("%d等于0\n",n);
else
    printf("%d大于0\n",n);

级联式 if 语句独特的书写形式:

if(表达式)
    语句
else if(表达式)
    语句
else if(表达式)
    语句
...
else
    语句


1.5 “悬空else” 的问题

当 if 语句嵌套时,千万要当心著名的“悬空else”的问题。

思考下面这个例子:

#include <stdio.h>

int main()
{
  int a = 0;
  int b = 2;
  if(a == 1)
    if(b == 2)
      printf("hehe\n");
  else
    printf("haha\n");
  return 0;
}


程序运行结果是什么呢?

很多人认为 a = 0,不等于1,程序执行else子句,打印haha,但是你运行程序的时候,输出结果:什么都没有打印。


这就是悬空else的问题,如果有多个 ifelse 的时候,else 总是跟最近的未配对的 if 匹配。

如果代码改成下面这样更容易理解了

#include <stdio.h>

int main()
{
  int a = 0;
  int b = 2;
  if (a == 1)
  {
    if (b == 2)
      printf("hehe\n");
    else
      printf("haha\n");
  }
    
  return 0;
}

或者如果我们希望else确定和第一个if匹配,可以把代码改成这样。

#include <stdio.h>

int main()
{
  int a = 0;
  int b = 2;
  if (a == 1)
  {
    if (b == 2)
      printf("hehe\n");
  }
  else
  {
    printf("haha\n");
  }
    
  return 0;
}

只要带上适当的大括号,代码的逻辑就会更加清晰,所以大家以后子啊写代码的时候要注意括号的使用,让代码的可读性更高。

注:if 和 else 语句默认都只控制一条语句,想要控制多条语句需要加上{},构成复合语句

2、switch语句

除了 if 语句外,C语言还提供了 switch 语句来实现分支结构

switch 语句是一种特殊形式的 if...else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式。

switch 的语法格式:

switch(表达式)
{
    case 常量表达式:
        语句
    case 常量表达式:
        语句   
    ...
    case 常量表达式:
        语句  
    default :语句
}

switch 的组成部分:


控制表达式:switch 后面必须跟着圆括号括起来的整形表达式。C语言把字符当成整数来处理,因此在 switch 语句中可以对字符进行判定。但是,这不适用于浮点数和字符串。

分支标号:每个分支的开头都有一个标号,格式如下:

case 常量表达式:


常量表达式很像普通的表达式,只是不能包含变量和函数调用。因此,5是常量表达式,5 + 10 也是常量表达式,但 n + 10 不是常量表达式(除非n是表示常量的宏)。分支标号中常量表达式的值必须是整数(字符也可以)


语句:每个分支标号的后边可以任意数量的语句,并且不需要用花括号把这些语句括起来。每组语句的最后一条通常是break 语句。

C语言不允许有重复的分支标号,但对分支的顺序没有要求,特别是 default 分支不一定要放置在最后。

default 的作用:

switch 语句不要求一定有 default 分支。如果 default 不存在,而且控制表达式的值和任何一个分支标号都不匹配的话,控制会直接传给 switch 语句后面的语句。

3、while循环

循环是重复执行其他语句(循环体)的一种语句。

3.1 while语句的格式

while(表达式)
    语句

3.2 while语句的执行流程

首先执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。

3.3 while语句的实践

练习:在屏幕上打印1~10的值

代码:

3.3 while语句的实践
练习:在屏幕上打印1~10的值
代码:

#incl

运行结果:

4、for循环

4.1 for语句的格式

for(声明或者表达式1;表达式2;表达式3)
    语句

表达式1:用于循环变量的初始化

表达式2:用于循环结束条件的判断

表达式3:用于循环变量的调整


4.2 for语句的执行流程

首先执行表达式1初始化循环变量,接下来就是执行表达式2的判断部分,表达式2的结果如果==0,则循环结束;表达式2的结果如果!=0则执行训话语句,循环语句执行完后,再去执行表达式3,调整循环变量,然后再去表达式2的地方执行判断,表达式2的结果是否为0,决定循环是否继续。

整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环

4.3 for语句的实践

练习:在屏幕上打印1~10的值

代码:

#include<stdio.h>

int main()
{
  int i = 0;
  for (i = 1; i <= 10; i++)
  {
    printf("%d ", i);
  }

  return 0;
}

运行结果:

4.4 for语句和while语句的对比

5、do…while循环

5.1 do…while语句的格式

do
{
    语句
}while(表达式);

whilefor 这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;

do...while 循环则是先直接进入循环体,执行循环鱼护,然后在执行 while 后的判断表达式,表达式为真,就会进行下一次,表达式为假,则不再继续循环。


5.2 do…while语句的执行流程



do...while 循环中先执行图上的“语句”,执行完语句,在去执行“判断表达式”,在判断表达式的结果是!=0,则继续循环,执行循环;判断表达式的结果==0,则循环结束。

所以在do...while 语句中循环体是至少执行一次的,这是do...while 循环比较特殊的地方。


5.3 do…while语句的实践

练习:在屏幕上打印1~10的值

代码:

#include<stdio.h>

int main()
{
  int i = 1;
  do
  {
    printf("%d ", i);
    i++;
  } while (i<=10);

  return 0;
}


运行结果:

6、break和continue

在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环。

  • break 的作用是用于永久的终止循环,只要break 被执行,直接就会跳出循环,继续往后执行。
  • continue 的作用是跳出本次循环 continue 后边的代码


7、goto语句


C语言提供了一种非常特别的语法,就是goto 语句和跳转标号,goto 语句可以实现在同一个函数内跳转到设置好的标号处。

标号只是放置在语句开始处的标识符:

标识符:  语句

goto语句格式

goto 标识符;

例如:

#include<stdio.h>

int main()
{
  printf("hehe\n");
  goto next;
  
  printf("haha\n");

next:
  printf("跳过haha的打印\n");

  return 0;
}

运行结果:


goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以能不用尽量不去使用;但是goto 语句也不是一无是处,在多层循环的代码中,如果想快速跳出使用goto 就非常的方便了。

for(...)
{
    for(...)
    {
        for(...)
        {
            if(1)
              goto next;
        }
    }
}

next:
     //...


本来for 循环也使用break 跳出,但是break 只能跳出一次循环,这里就要用3个break 才可以跳出循环,所以这种情况使用goto语句就更快捷。

8. C语言必刷题

  1. 打印1~100之间的奇数
  2. 9*9乘法表



相关文章
|
4天前
|
C语言
【C语言基础】:分支与循环
【C语言基础】:分支与循环
|
12天前
|
C语言
c语言循环题目
c语言循环题目
|
13天前
|
C语言
C语言控制流程详解:分支与循环语句
C语言控制流程详解:分支与循环语句
11 0
|
18天前
|
算法 C语言 索引
C语言中的for循环:深入探索与实用技巧
C语言中的for循环:深入探索与实用技巧
15 1
|
18天前
|
C语言
C语言中如何避免循环死循环
C语言中如何避免循环死循环
14 1
|
18天前
|
C语言
c语言循环设计程序结构
c语言循环设计程序结构
17 0
|
20天前
|
存储 C语言
C语言for循环详解
C语言for循环详解
|
20天前
|
C语言
C语言中的循环控制结构与循环语句详解
C语言中的循环控制结构与循环语句详解
19 0
|
20天前
|
C语言
C语言中的条件控制循环:深入解析与实战应用
C语言中的条件控制循环:深入解析与实战应用
27 1
|
20天前
|
C语言
C语言条件控制循环的深入解析
C语言条件控制循环的深入解析
21 0