C语言三大结构


初识C语言已经结束,感谢大家的支持,接下来为大家介绍一下C语言的三大基本结构——顺序结构、分支结构和循环结构。

顺序结构

顺序结构,顾名思义,顺序结构就是按顺序写的C语言程序,所有的语句都是按照线性的顺序执行。例如

#include <stdio.h>

int main()
{
	int a = 0;
	printf("a = %d\n",a);
	a = a + 1;
	printf("a = %d\n");

	return 0;
}

我们定义一个整型变量a并赋值 0 ,打印 a 的值,然后给 a 加 1,再打印 a 的值,得到结果
在这里插入图片描述
程序从第一行开始,一行行依次编译并执行,这就是顺序结构。

分支结构

生活中我们处处面临选择,C语言也衍生了分支结构,我们可能会用到单分支,也可能用到多分支。

1.if语句

if (表达式)
    语句1;
else 
    语句2;

在这里插入图片描述

这是一个单分支,若满足if 后的条件表达式,则执行语句1,若不满足,则执行语句2。

if (条件表达式)
    语句1;
else if(条件表达式)
        语句2;
else
        语句3;

在这里插入图片描述
这是一个多分支,若满足第一个 if 后的条件表达式,则执行语句1;若不满足,则进入下一个 if 后的条件表达式进行判断,若满足执行语句2,不满足则执行语句3。

在 if (条件表达式)中,括号中为判断条件,判断条件也可以为赋值语句,例如

在这里插入图片描述
此代码中,若 if 后条件表达式中为真,则打印 123456 ,否则打印 789 。但是 if 后条件表达式为赋值语句,对 a 赋值 1,说明此条件表达式一直为真,一直打印 123456。【在 if ()的条件表达式中,0 是表示假,非 0 则表示真】
在这里插入图片描述
此代码中,第七行定义了 a = 0,进入 if 条件表达式的判断,a = 0,所以为假,执行第11行内容,打印 789。(a = 0 的意思是把 0 赋给变量 a)
再来看一段代码
在这里插入图片描述
此代码中,判断条件为 a == 1,意思为:判断变量 a 是否等于 1,若等于则执行第9行代码,否则执行第11行代码。(== 是判断两个变量是否相等, = 是为变量赋值)

2.switch语句

(1)switch语句中的break

#include <stdio.h>

int main()
{
    int a = 0;
    scanf("%d",&a);
    switch (a)
    {
         case 1:
             printf("周一\n");
         case 2:
             printf("周二\n");
         case 3:
             printf("周三\n");
         default:
             printf("输入错误,请重新输入!\m";
    }
    return 0;
}

我们想 输入一个值,若输入 1,打印周一;输入 2,打印周二;输入 3,打印周三,输入别的值,则打印 输入错误。运行结果是这样的:
在这里插入图片描述
我们发现,输入 1后将所有要打印的内容都输出了一遍,这是因为缺少了break语句。我们在每句case和default的最后都加上一个break,重新测试一下。
在这里插入图片描述
由此可知,若没有break,输入 1,决定了程序从case1进入,但是没有出口,所以会一直执行,直到结束。加上break后,再输入 1,程序会从case1开始,遇到第一个break结束,break会让程序跳出switch。
注意:case后面只能跟整型常量表达式,若写成case 1.1 ,这是错误的。

如果我们要让case 1,case 2, case 3都打印同样的值,如图
在这里插入图片描述
对每一个case后面的语句都进行修改,在数量少的时候是可以的,如果数量多,一个个修改就显得尤为繁琐,这时候我们该怎么办呢?
在这里插入图片描述
这时候我们可以进行“干掉”,如图,将前6个case每一个后面的内容都“干掉”,只在case 7后面写上打印周一,这时候我们输入 1~7 中任意值,都会打印周一。

(2)switch中的default子句

在switch中,如果表达的值与所有的case都不匹配时,switch中所有的语句都会被跳过。(除了default)但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?学会使用default子句。当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。所以,每个switch中这能出现一条default子句。

default子句可以放在switch中的任意位置,如图
在这里插入图片描述
如图,这样也是正确的,不过我们一般放在最后。
在这里插入图片描述

循环结构

1.while循环

(1)语法

while(表达式)
 循环语句;

比如我们想要实现,在屏幕上打印1~10的数字。

#include <stdio.h>
int main()
{
    int i = 1;
    while(i<=10)
    {
     printf("%d ", i);
     i = i+1;
    }
     return 0;
}

这段代码会打印 1~10数字。

(2)while循环中的break和continue

#include <stdio.h>
int main()
{
    int i = 1;
    while (i <= 10)
    {
        if (i == 5)
           break;
        printf("%d ",i);
        i = i + 1;
    }
    return 0;
}

这段代码会打印什么呢?如图
在这里插入图片描述
我们发现只打印了1 2 3 4,这是因为break。
在while循环中,如果遇到break,直接终止循环跳出。

#include <stdio.h>
int main()
{
    int i = 1;
    while (i <= 10)
    {
        if (i == 5)
           continue;
        printf("%d ",i);
        i = i + 1;
    }
    return 0;
}

在这里插入图片描述
我们会发现,此代码结果还是打印 1 2 3 4,但是这个1234与之前break的1234不同。接下来我们一点点分析。
先从1打印到4,当 i 增加到 5 时,if语句中条件表达式成立,再执行continue,continue的作用是:跳过本次循环,直接进入while的判断环节,判断下次能否执行,i = 5时,一直在if 和while的条件之间跳转,陷入了一个死循环。所以输出 1 2 3 4。

注意:continue是终止本次循环,跳过continue后面的语句,直接进入下次循环的条件判断。

2.for循环

(1)语法

for(表达式1;表达式2;表达式3)
 循环语句;

表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。
在这里插入图片描述
开头我们定义了一个整型变量 i 赋值0,在for循环的开始,我们初始化变量 i ,若开始定义 i 时初始化过了,for循环中 i 的初始化可以省略,但要加分号,如图
在这里插入图片描述
for()中 i 的初始化有时可以省略,但后面的循环条件和迭代不可写错,更不能省略,否则会陷入死循环,或不能运行。(下面我们省略一下迭代)
在这里插入图片描述
可以看到,程序陷入了死循环。

(2)for循环中的break和continue

for循环中的break和continue与while循环中的相似,但也是有些许的差异。
我们先来看break:

#include <stdio.h>
int main()
{
    int i = 0;
    for (i = 0;i < 5;i++)
    {
        if (i == 3)
           break;
        printf("好好学习,天天向上\n");
    }
    return 0;
}

在这里插入图片描述
我们可以看出,for循环中的break和while中的break相差不大,都是终止循环。
再来看continue:

#include <stdio.h>
int main()
{
    int i = 0;
    for (i = 0; i < 5; i++)
    {
        if (i == 3)
            continue;
        printf("好好学习,天天向上\n");
    }
    return 0;
}

在这里插入图片描述
这时候就与while循环中的break有些许差异了。进入循环,i = 1, i = 2时各打印一遍内容,到i = 3时,跳过本次循环,然后进行 i++,再正常打印 i = 4 和 i = 5时的内容,这不是死循环,只是跳过循环体中的内容,进入到循环的迭代,然后重新进行条件的判断。这就是for循环中continue和while循环continue的差异。

(3)笔试题

让我们来看一道真实的笔试题。

#include <stdio.h>
int main()
{
 int i = 0;
 int k = 0;
 for(i =0,k=0; k=0; i++,k++)
        k++;
 return 0;
}

请问此循环要循环多少次?
此循环中,先对 i 和 k 进行初始化,再进入判断条件,发现判断条件为赋值语句 k = 0,将 0 赋给变量 k,0为假,所以不会进入循环,答案就是,此循环执行了0次。

3.do while循环

(1)语法和特点

do
 循环语句;
while(表达式);

注意:在do while循环中,最后while()后的分号一定不要漏掉!!!
此代码中,我们观察一下,定义整型变量 i 并赋值 0,循环体中每次循环都给 i 加1,后面又发现while循环的条件为 i < 0,条件根本不满足,这时候会先执行一次循环体中的内容,也就是先在屏幕上打印一行数据,再根据条件判断是否循环。
也就是说 do while循环能使循环体至少执行一次。

(2)do while中的break和continue

我们先说break:
在这里插入图片描述
我们可以看到,在do while中,break也是用来终止循环的。

再来看continue:
在这里插入图片描述
我们可以看出,在 i = 0, i = 1, i = 2时,程序都可以正常打印,当 i = 3时,满足了if语句中的条件表达式,执行continue,此时会跳过后面的printf 和 i++迭代,直接进入判断条件,i 的值还是3,没有进行迭代,所以又回到了if中的条件表达式,又遇到continue,依次往复,形成了死循环。

4.goto语句

C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。当有多层循环时,break只能跳出本层循环(一层),而goto语句可以随意跳转。
在这里插入图片描述
此程序中,先打印两次hello world,然后利用goto语句跳转至开头,再打印两次,依次往复,形成死循环。
在这里插入图片描述
我们可以看出,break只能跳出一层循环。
在这里插入图片描述
我们可以看出,goto语句直接跳出了两层循环,陷入了死循环,由此可见,goto语句是个双刃剑,用好了会事半功倍,用不好会产生很多bug。

注:本次列车暂时到站啦,文章中有错误、不足之处欢迎大佬指正,让我们共同学习,共同进步,一切成功的秘诀,都在于我们不懈的追求,加油!

  • 21
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值