C语言初阶——1. 分支与循环

       时间过得可真快,距离上一次写博客已经过了一个月了。这一个月事儿可真是太多了,终于迎来了这美好的可以安静写博客的机会(其实就是为自己偷懒找的借口)。

                                 

       那废话不多说,之后我们还是要好好学习,好好写博客。

                                                         

       今天带来的是C语言初阶的分支与循环。


目录:

一、分支语句 (选择结构)

1.1 if语句

1.1.1 if语句语法结构

1.1.2 悬空else

1.2 switch语句

1.2.1 switch语句语法结构

1.2.2 default子句

二、循环语句

2.1 while循环

2.1.1 while循环语法结构

2.1.2 while循环语句执行流程

2.1.3 while语句中的break和continue

2.2 for循环

2.2.1 for循环语法结构

2.2.2 for语句执行流程

2.2.3 for循环中的break和continue

2.2.4 for语句的循环控制变量

2.3 do...while() 循环

2.3.1do...while语句的语法

2.3.2 do..while语句的特点

2.3.3 do...while循环中的break和continue

三、goto语句

结语:


        这一部分那就主要是分支语句和循环语句,分支语句包括:if else语句,switch选择语句。循环语句包括:while循环语句,for循环语句,do while循环语句。最后还有goto语句。

        那什么是语句呢?

        C语句可以分为以下五类:1.表达式语句 2.函数调用语句 3.控制语句 4.复合语句 5.空语句。

         这里可以简单的提一下: 控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成。

C语言有九种控制语句,可分为以下三类:

​​1. 条件判断语句也叫分支语句:if语句、switch语句;

2. 循环执行语句:do while语句、while语句、for语句;

3. 转向语句:break语句、goto语句、continue语句、return语句。


一、分支语句 (选择结构)

       不同的选择有不同的结果,C语言也一样,不同的选择,代码执行情况也会不同。就和做选择题一样,给几个选项,对号入座。(最简单的理解,好好学习,走上人生巅峰;那不学习,就只能家里蹲呗)


1.1 if语句

1.1.1 if语句语法结构

        不管怎么样,首先先了解语法结构是什么样的。(得知道是咋用的吧)

        请看:

if (表达式)

    语句;

if (表达式1)

    语句;

else

    语句;

//多分支

if (表达式1)

    语句;

else if (表达式2)

    语句;

else

    语句;

如果表达式的结果为真,则语句执行,0表示假,非0表示真。

以下三种方式都可以使用,根据不同的场景选择不同的方式。

第一种:

int main()
{
	int n = 0;//定义一个变量
	scanf("%d", &n);//输入
	if (n % 2 == 0)//判断是否为偶数
	{
		printf("偶数");//输出
	}
	return 0;
}

第二种:

int main()
{
	int n = 0;//定义一个变量
	scanf("%d", &n);//输入
	if (n % 2 == 0)//判断是否为偶数
	{
		printf("偶数\n");//输出
	}
	else
	{
		printf("奇数\n");//不是偶数就是奇数
	}
	return 0;
}

第三种:

​
int main()
{
	int n = 0;//定义
	scanf("%d", &n);//输入
	if (n == 0)//判断
	{
		printf("为0\n");
	}
	else if (n > 0)
	{
		printf("正数\n");
	}
	else
	{
		printf("负数\n");
	}
	return 0;
}

       这里是我的一个小习惯,不管是if,else if还是else后面我都习惯加上大括号再写代码,既美观,又可以增加代码的可读性,这样写也可以避免一些问题的出现,比如悬空else。

1.1.2 悬空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 ;
}
这段代码正确的理解应该是这样
int main()
{
	int a = 0;
	int b = 0;
	if (1 == a)
	{
		if (2 == b)
		{
			printf("hehe\n");
		}
		else
		{
			printf("haha\n");
		}
	}
	return 0;
}

这就是悬空else的问题,else匹配是else和它离的最近的且还没有匹配的if匹配。

这只是一种理解方式,大括号加在不同的位置会有不同的效果。

还是那句话,我建议,加括号!加括号!加括号!

总的来说,if有很多书写形式
(1)
if ( condition ) {
    return x ;
}
return y ;
(2)
if ( condition )
{
    return x ;
}
else
{
    return y ;
}
(3)
int num = 1 ;
if ( num == 5 )
{
    printf ( "hehe\n" );
}
(4)
int num = 1 ;
if ( 5 == num )
{
    printf ( "hehe\n" );
}

 (2)这种形式更加整洁美观,代码可读性高。

 (4)这种最大的区别就是括号里的写法,(=)的意思是赋值,(==)的意思是判断是否相等

 这里缺少了一个=,但是程序还是跑过去了,但会有一个警告。

 这样写一旦缺了一个=,程序会直接报错,根本就跑不过去,避免因为忘了加=产生的bug。


1.2 switch语句

 switch语句也是一种分支语句,常用于多分支的语句,分支了,用if语句就非常麻烦了。

比如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日  

这样用if语句用起来就非常麻烦。

1.2.1 switch语句语法结构

它的语法形式

switch ( 整型表达式 )
{
    case ( 整型常量表达式):
        break;
    default ():
        break;
}
上述例子可以这样写:
int main()
{
    int day = 0;
    scanf("%d", &day);//输入1——7会对应输出
    switch(day)
   {
        case 1:
            printf("星期一\n");
            break;//break作用是跳出分支语句,实际是把语句列表划分为不同的分支部分
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;    
        case 4:
            printf("星期四\n");
            break;    
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
        case 7:
            printf("星期天\n");    
            break;
   }
    return 0; 
}

还可以换一种形式:

int main()
{
    int day = 0;
    scanf("%d", &day);
    switch(day)
   {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            printf("工作日\n");//输入1——5,输出工作日
            break;//break作用是跳出分支语句,实际是把语句列表划分为不同的分支部分
        case 6:
        case 7:
            printf("休息日\n");//输入6、7,输出休息日
            break;
   }
    return 0; 
}

根据我们的需求可以变换代码的形式。

由以上例子可知,

在最后一个 case 语句的后面加上一条 break语句,之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句。

1.2.2 default子句

用于表达式的值与所有的 case 标签的值都不匹配的情况。
其实也没什么,结构就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在 C 中并不认为是个错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
可以在语句列表中增加一条 default 子句,把下面的标签
default
写在任何一个 case 标签可以出现的位置。
switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个 switch 语句中只能出现一条 default 子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个 case 标签一样执行 default 子句。

所以在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break。


 二、循环语句

2.1 while循环

       循环语句,顾名思义就是语句可以执行多次,if语句当条件满足的情况下,该语句只会执行一次,但会有同一件事需要我们去执行多次的情况,这里就需要用到循环语句。

       第一种while循环

2.1.1 while循环语法结构

//while循环 语法结构

while(表达式)

{

        循环语句;

}

这里简单画了一个图(第一次画,有点丑,别介意)

2.1.2 while循环语句执行流程

while语句执行的流程图:(表达式 == expr)

下面有一个简单的代码,来计算n的阶乘的和

int main()
{
	int n = 0;//定义
	scanf("%d", &n);//输入
	int j = 1;//阶乘,乘法需要设成1
	int m = 0;//每个阶乘的和
	int tmp = n;//把n存在tmp中,下面的n的值会变
	while(tmp)
	{
		n = tmp;
		j = 1;//重置j的值
		while (n)
		{
			j *= n;//计算阶乘
			n--;
		}
		m += j;//计算阶乘的和
		tmp--;
	}
	printf("%d\n", m);//输出和
	return 0;
}

这种方法也许不是最简便的,这里只提一种,简单介绍while循环语句的用法。

while( )//这个括号里是判断语句 ,判断循环什么时候终止,也是0表示假,非0表示真

{

    循环语句;

    //最后要输入调整部分,循环条件的调整,如上面的n--,tmp--

}

2.1.3 while语句中的break和continue

       这里先介绍一下break这个关键字,它不仅可以在循环语句中使用,分支语句等都可以使用,那必定是有使用它的意义。

       其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
所以while中的break是用于永久终止循环的。
        这里的break它的作用是不执行该循环体break下面的语句,直接跳出循环体,所以该程序的输出结果是:1 2 3 4 。
int main()
{
    int i = 1;
    while(i<=10)
    {
        if(i == 5)
        break;
        printf("%d ", i);
        i++;
    }
    return 0;
}
continue在while循环中的作用是:
       continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,
而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i++;
	}
	return 0;
}

2.2 for循环

       介绍完while循环,那再来说一下for循环,for循环也是我用的最多的,也是最方便的一个循环语句。

2.2.1 for循环语法结构

//for循环的语法结构

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

    循环语句;

//表达式1为初始化语句,用于初始化循环变量

//表达式2为条件判断部分,用于判断循环时候终止

//表达式3为调整部分,用于循环条件的调整

//在屏幕上打印1——10的数字
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}

2.2.2 for语句执行流程

for语句执行的流程图:

       由此观之,对比一下for循环和while循环,for循环在编写的时候更加简洁,更加方便,查找修改集中,所以for循环的使用频率也更高。

2.2.3 for循环中的break和continue

        当然,在for循环中也可以使用break和continue,它们的意义和while循环中相差不大,这里就不过多介绍了,但还是有一定的差异。

break:

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

continue:

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

2.2.4 for语句的循环控制变量

建议:
1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
// 前闭后开的写法
for  ( i = 0 ; i < 10 ; i ++ )
{
}
// 两边都是闭区间
for  ( i = 0 ; i <= 9 ; i ++ )
{
}

        这里稍微提一下,for循环后面的括号中的三个表达式是可以省略的,可以这样写,但不建议这样,容易导致出现一些问题。如果省略掉,for循环判断条件恒为真。


2.3 do...while() 循环

2.3.1do...while语句的语法

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

do...while语句执行的流程:

 2.3.2 do..while语句的特点

        不管三七二十一,循环至少执行一次,使用的机会比较少,所以不常用。

int main()
{
	int i = 10;
	do
	{
		printf("%d\n", i);
	} while (i < 10);
	return 0;
}

        如果在编译器上执行,屏幕上会直接打印10,i=10,判断条件i<10这个一开始就是错的,但do...while语句会直接执行一次,再开始判断,所以直接打印一个10。

2.3.3 do...while循环中的break和continue

用途差不多,也就不过多说明了,直接呈上下面两段代码

break:

int main()
{
	int i = 10;

	do
	{
		if (5 == i)
			break;
		printf("%d\n", i);
	} while (i < 10);

	return 0;
}

continue: 

int main()
{
	int i = 10;

	do
	{
		if (5 == i)
			continue;
		printf("%d\n", i);
	} while (i < 10);

	return 0;
}

三、goto语句

        C语言中提供了可以随意滥用的 goto 语句和标记跳转的标号。 从理论上 goto 语句是没有必要的,实践中没有 goto 语句也可以很容易的写出代码。 但是某些场合下goto 语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
        例如:一次跳出两层或多层循环。
多层循环这种情况使用 break 是达不到目的的。它只能从最内层循环退出到上一层的循环。
代码如下:
for (...)
{
	for (...)
	{
		for (...)
		{
			if (...)
				goto to;
		}
	}
	…
}
to :
if (disaster)
…

结语:

        那关于C语言的分支与循环就介绍完了(完结撒花)。之后也会分享更多的有关C语言的内容,尽请期待。

猜你喜欢

转载自blog.csdn.net/m0_64607843/article/details/122506514