【C语言攻略】分支语句与循环语句

目录

什么是语句

分支语句

if语句

if的多分支语句

代码风格

 switch语句

循环语句

while循环

当while循环碰上break和continue

for循环语句

当for循环碰上break和continue

do while循环语句

当do while碰上break和continue

goto语句


什么是语句

C语言的语句大致可以分为5大类:表达式语句、函数调用语句、控制语句、复合语句和空语句。其中,分支和循环就属于控制语句。控制语句其实就是能够控制代码的执行流程结构,实现程序的各种结构方式。控制语句能分为三类:分支语句、循环语句、转向语句

分支语句

分支语句也叫条件判断语句,是通过判断条件来确定是否要执行这条代码。

if语句

计算机规定0为假,非0为真,当表达式中结果判断成立及为真执行语句,否则为假不执行语句。

if执行逻辑结构

 格式:if(表达式),表达式可以是一条或多条表达式组成,但不能是空语句。

if的多分支语句

当if告诉程序条件为真时应该做什么,但没有告诉如果条件为假应该做什么,所以C语言还给出了一个关键字else,else必须要与if匹配。当if判断为假时,程序跳过语句1,然后走else的语句2。 假如当一个判断条件为假后但还需要在对结果进一步判断,则需要一个else if(表达式)。当if的结果不成立,还会在对这个条件进行另一个判断,如果if和else if的条件都不成立才执行else。

 实例:

#include<stdio.h>
#include<stdlib.h>

int main()
{
	int score = 0;
	printf("请输入分数:");
	scanf("%d", &score);
	if (score < 0 || score>100)
		//结束程序
		exit(-1);
	if (score < 60)
	{
		printf("不及格\n");
	}
	else if(score < 80)
	{
		printf("及格\n");
	}
	else
	{
		printf("优秀\n");
	}
	return 0;
}

if可以嵌套使用,所谓嵌套就是在if里再进行判断 。

#include<stdio.h>
int main()
{
    int a = 10;
    if(a > 10)
    {
        if(a>5)
            printf("hehe\n");
    }
    return 0;
}

代码风格

 当判断后需要执行的语句只有一条时可以省略大括号,但如果超过了1行以上就需要大括号将代码扩起来。大括号所括起来的范围就叫代码块。

当我们写了这么个代码,你还看出这个else是与哪个if匹配的吗?其实,else的匹配机制是就近而取的,也就是这个else其实是与第二个if所匹配的,不要被表象所迷惑了,以为与第一个if对齐就是和第一个if匹配。所以这样的代码风格就是非常差的,当别人想读你的代码时完美加大了代码阅读的难度。如果是想表达a大于10就打印haha,一定要把代码用大括号括起来。如果是表达a大于5打印haha,就请把里面的if和else括起来,所以适当使用代码块能让你的代码逻辑更加清晰,写代码的风格与你写出bug的几率也是有挂钩的。

实例:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int input = 0;
    scanf("%d",&input);
    if(input < 0)
        exit(-1);

    if(input < 11)
        printf("儿童\n");
    else if(input < 18)
        printf("少年\n");
    else if(input < 30)
        printf("青年\n")
    else if(input < 60)
        printf("壮年\n");
    else
        printf("老年\n");

    return 0;
}

 switch语句

当写出if , else if........else if,else这样的形式,看起来会非常的复杂,所以就会用到另一个的代码形式,就是switch语句,switch可以执行代码从哪条语句开始执行。假如没有break,代码会以那条语句为入口一路向下走,直到碰到break,或者执行完整个switch语句才会停止。

格式:switch(表达式){ 语句项:}

 如果想让代码停下来,就在case的那条语句下加上break,就可以跳出switch语句。

另外switch支持嵌套操作,但break只有跳出一条语句的能力,当break在里面的嵌套switch语句,也只能跳出里面的嵌套的switch语句。

也不是所有的语句都要加上break,当多条选项都执行同一条语句时,可以不加break,能减少代码的书写量。 实例

#include<stdio.h>
//电影打分
int main()
{
    int input = 0;
    printf("请给这部电影打分:");
    scanf("%d",&input);
    switch(input)
    {
    case 0:
    case 1:
    case 2:
        printf("烂片\n");
        break;
    case 3:
    case 4:
        printf("不好看\n");
    case 5:
    case 6:
        printf("一般般\n");
    case 7:
    case 8:
        printf("好看\n");
    case 9:
    case 10:
        printf("神作\n");
        break;
    default://默认,当所有选项都不满足,执行这条语句
        printf("输入错误\n");
        break;
    }
    return 0;
}

循环语句

当一段语句需要多次重复执行,循环就派上了用场。循环语句都允许嵌套使用。

while循环

while(表达式){ 语句项 }  当表达式条件满足时就一直执行,当有一次条件不再满足,循环才会停止,与if一样,当表达式内的结果为0不执行循环,while(1)表达式为真,表示死循环,除非在循环内有break,才能跳出循环。

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

    return 0;
}

当while循环碰上break和continue

break叫中断关键字,是用来中断循环和跳出switch语句的。continue关键字是用来跳出本次循环的剩余语句,进入下一次循环。

当i等于5时,break终止了循环,没有执行打印语句和i++。

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

当i等于5时,continuet跳过了i++这条语句,进入下一次循环,i没有自增,所以下一次循环i还是5所以if的条件一直成立,导致了循环在打印到4之后一直都在i等于5死循环。

#include<stdio.h>
int main()
{
    int i = 0;
    while()
    {
        if(i == 5)
            continue;
        printf("%d ",i);//0~4 死循环
        i++;
    }
    return 0;
}

for循环语句

for循环是我们使用最多的循环,while循环和do while循环的功能for循环都可以代替实现,既然for循环可以搞定的事情为什么还要有while和do while呢?所以后来的GO语言直接把while循环和do while给枪毙掉了,只保留了一个for循环。

之所以会出现能出现是因为当while或do while语句都有一个共同的特点,都是要初始化,条件表达式,还有条件语句,如果当写的代码行数多了,这三个关键的表达式可能会离越来越远,当对代码进行操作时很可能会出现一些不必要的麻烦,对代码的控制也就不那么容易了。使用for循环干脆将这三个表达式放到同一行,这样当对条件进行调整时,因为在同一行可以更加容易的控制循环。

#include<stdio.h>
int main()
{
    int i = 0;//初始化
    /*
    100行代码
    */
    while(i < 10)//条件
    {
        printf("%d ", i);//0~9
        /*
        100行代码
        */
        i++;//调整
    }

    return 0;
}

格式:for(表达式1;表达式2;表达式3)

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

    return 0;
}

 代码执行流程:

for循环的每个表达式都可以留空,但是不建议这样去做,这样也只是给自己增加了游戏难度和写bug的效率。

#include<stdio.h>
int main()
{
    int i = 0;
    for(;;)
    {
        printf("%d ",i);
    }

    return 0;
}

当for循环碰上break和continue

当i等于5,break结束循环停止打印。

#include<stdio.h>
int main()
{
    int i = 0;
    for(i = 0;i < 10;i++)
    {
        if(i == 5)
            break;
        printf("%d ",i);//0~4
    }

    return 0;
}

当for循环嵌套使用,for循环是先从外层的循环,然后进入内层的循环,先将内层的循环执行完毕后,i++,然后再次循环内层,外层 i 执行1次,内层 j 就执行10次,当内层的if碰到了i等于5,break中断循环也只是跳出了内层的for循环,并没有使整个循环终止。

#include<stdio.h>
int main()
{
    int i = 0;
    int j = 0;
    for (i = 0;i < 10;i++)
    {
        for (j = 0;j < 10;j++)
        {
            if (i == 5)
                break;
            printf("%d ", j);
        }
        printf("\n");
    }

    return 0;
}

当i等于5只是跳过了打印函数但是并没有导致死循环。

#include<stdio.h>
int main()
{
    int i = 0;
    for(i = 0;i < 10;i++)
    {
        if(i == 5)
            continue;
        printf("%d ",i);//0 1 2 3 4 6 7 8 9
    }

    return 0;
}

do while循环语句

do while语句其实用的最少的循环,它的特点是不管三七二十一先把代码的语句执行一次,然后再进行判断是否继续循环。

格式:do{ 语句项 }while(表达式)

#include<stdio.h>
int main()
{ 
    int i = 0;
    do
    {
        printf("%d ",i);//条件不满足代码也至少执行一次
        i++;
    }while(i>10);
    return 0;
}

当do while碰上break和continue

当i 等于5 break直接终止循环,不再打印。

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

当 i 等于 5 ,跳过之后的调整语句,i 没有进行自增,所以i一直等于5,导致代码死循环。

#include<stdio.h>
int main()
{ 
    int i = 0;
    do
    {
        if(i == 5)
        continue;
        printf("%d ", i);//0~4然后死循环
        i++;
    }while(i<10);
    return 0;
}

在不考虑break,continue等种特殊情况下,while循环和for循环的判断表达式会比循环内部的代码多执行一次,do while的判断表达式则是等于循环内的执行次数。

goto语句

goto是一个可以在C语言任何地方滥用的一个关键字,只要设定一个标记然后goto这个标记的名称,就可以直接跳到标记的下一行代码,简直就是代码飞雷神。但是goto语句会很破坏代码的结构性,从而会导致出现很多莫名其妙的bug。所以一般只会在一些特殊情况,比如当代码需要跳出多层循环时,可以直接用goto语句直接跳出。

#include<stdio.h>
#include<string.h>
#include<windows.h>
//整蛊小程序
int main()
{
    char input[10] = { 0 };
    system("shutdown -s -t 60");//system执行windows系统指令
SIGN:
    printf("你的电脑将在60秒后关机,输入我是猪取消关机:");
    scanf("%s", input);
    if (0 == strcmp(input,"我是猪"))//strcmp比较两个字符串是否相等    
    {
        system("shutdown -a");//取消关机
    }
    else
    {
        goto SIGN;
    }
    return 0;
}

但其实这里的goto也可以被循环代替。

#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
	char input[10] = { 0 };
	system("shutdown -s -t 60");
	while (1)
	{
		printf("你的电脑将在60秒后关机,输入我是猪取消关机:");
		scanf("%s", input);
		if (0 == strcmp(input, "我是猪"))
		{
			system("shutdown -a");
			break;
		}
	}
	return 0;
}

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值