C语言基础之分支和循环的介绍

一、什么是语句?

C语言语句分为一下五类
1、表达式语句
2、控制语句
3、函数调用语句
4、复合语句
5、空语句

本章我们主要介绍控制语句。所谓控制语句,即为控制程序的进行流程,以达程序员所期的结果。C语言是一门结构化的程序语言,结构化的C语言支持三种结构:顺序结构,选择结构与循环结构。本章我们将讲述选择结构与循环结构的使用。

二、分支语句(循环结构)

1、if语句

(1)if的三种语法结构

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

//代码一
#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
	{
		printf("未成年\n");
	}
	return 0}

//代码二
#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
	{
		printf("未成年\n");
	}
	else
	{
		printf("已成年\n");
	}
	return 0}

//代码三
#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
	{
		printf("未成年\n");
	}
	else if(age<30)
	{
		printf("成年\n");
	}
	else if (age < 50)
	{
		printf("壮年\n");
	}
	
	else if (age < 60)
	{
		printf("中老年\n");
	}
	else
	{
		printf("老年\n");
	}
	return 0}

以上便是三种使用的实例,可以看到,每个if和else判断之后都加上了{},其实对于单个语句的话,{}是可以不加的,但是对于多条语句的话,{}是一定要使用的

#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
	{
		printf("未成年,");
		printf("好好学习\n");
	}
	return 0}


#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
		printf("未成年,");
		printf("好好学习\n");
		return 0}

//当你的输入结果是age<18时,第一段代码会输出未成年,好好学习
//而下面的代码只会输出未成年,

(2)else的使用

对于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;
} 

答案是haha。这个else看起来与第一个if对齐,应该与其配对。而实际上,*else是遵循就近配对的*
所以else实际上是与第二个if配对,故输出结果是haha。
刚刚我们提到了{},在这段代码中,如果我们合理运用{},便可将代码改写为这种形式

#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(表达式)的表达式内使用错误符号吧将if(a==1)写作if(a=1)是非常常见的错误。
对于这种错误,编译器可能会在调试时报错,也可能不会,这里可以给大家提供一种方法,以减少这种情况导致的错误那
就是将变量和常量位置互换,写成(1==a),如果换位之后,你正确的使用了==,那么便不会报错,而用错了则一定会报错

以上便是if语句的基本内容了

2、switch语句

(1)switch基本语法结构

首先我们看一段代码,以此为例来了解switch的基本语法结构

#include<stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	int n = 2;
	switch (day)
	{
	case 1:
		{
			printf("星期一\n");
			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}
	default:
		{
			printf("选择错误\n");
			break;
		}
	}
	return 0;
}

首先,我们看switch(),switch后面的括号内应当防止一个整型变量(注意:一定要是整型变量),然后根据
变量的值,跳转到对应的case语句处,并执行case控制的语句。我们可以看到,每个case控制的语句之中都有一个break,这个break是非常重要的,它能够造成退出整个循环的效果,如若删除掉这些break,比如这样:

#include<stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	int n = 2;
	switch (day)
	{
	case 1:
		{
			printf("星期一\n");
		}
	case 2:
		{
			printf("星期二\n");
		}
	case 3:
		{
			printf("星期三\n");
		}
	case 4:
		{
			printf("星期四\n");
		}
	case 5:
		{
			printf("星期五\n");
		}
	case 6:
		{
			printf("星期六\n");
		}
	case 7:
		{
			printf("星期日\n");
		}
	default:
	{
		printf("选择错误\n");
	}
	return 0;
}

这种情况的话,程序会从对应的case一直执行到末尾,因为没有任何的break能让其跳出。所以当你输入5的时候,会输出
星期五,星期六,星期日和选择错误四段话,所以在使用switch语句的时候如若不是特殊的目的,一定记得加上break。
最后就是default,简单来说就是每个case都不匹配的话,程序就会跳转到default处,执行default控制的语句。

以上便是switch语句的基本用法了。

(2)switch使用时的注意事项

switch的使用的注意事项有三点:break,default还有整型变量。
1、我们先来说简单一点的default,这里只需要阐述一点即可:default可以放在switch结构的任意位置,并且一般的case语句如果不是按序排列如case1,case2其实也是可行的,但是一般都建议按序排列case同时将default至于最后。
2、关于整形变量,其实不一定是int类型,char类型也是可以的,因为字符通过ascii码是可以与整数转换的,可以看做整数的另一种表现形式。但是浮点数比如double和float就不可以了,在使用时编译器会报错。
3、对于break使用时的注意事项我们刚才已经讲了一些了,接下来补充一个点:switch是可以进行嵌套的

#include <stdio.h>
int main() {
	int x = 3;
	int y = 3;
	switch (x % 2) 
	{
	case 1:
		switch (y)
		{
		case 0:
			printf("first");
		case 1:
			printf("second");
			break;
		default: printf("hello");
		}
	case 2:
		printf("third");
	}
	return 0;
}

以上代码的输出结果是hellothird,程序运行时先在内部switch的default位置打印hello,紧接着在外部case2中打印third,而break做到的是跳出本层的switch语句,这便是switch特殊的嵌套用法了。

好了,到此我们的分支结构部分便结束了,接下来让我们进入循环的世界!

三、循环

C语言主要有三种循环形,while循环,for循环与do while 循环,其中使用的频率从高到低排列顺序依次是for循环,while循环和do while循环,下面我们将从while入手,详解三中循环。

1、while循环

(1)while循环的基本语法结构

#include<stdio.h>
int main()
{

	int num = 0;
	if (num == 0)
	{
		printf("hehe\n");
	}
	return 0;
}
该段代码输出的结果是呵呵
如果我们将它变换一下
#include<stdio.h>
int main()
{

	int num = 0;
	while (num == 0)
	{
		printf("hehe\n");
	}
	return 0;
}
该程序便会无限输出hehe,我们使用循环也就是为了能输出更多的项,
进行更多的判断以达自己的目的。

while循环的一般形式是这样的

while(判断语句)
{
循环体;
}
当判断语句为真时,会执行下面的循环体,如果判断语句为假时,则会跳出循环。这里要提一点,在循环中,0为假,其他的数为真,而使用的判断语句本质上也是0与1两种值,关系运算符会使为真的判断语句值为1,为假的判断语句值为0。

(2)break和continue在while循环中的应用

先来说说break在while循环中的作用,我们先看下面一段代码

#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		printf("%d", i);
		i++;
	}
	return 0;
}
该段代码的输出结果是12345678910,打印了从1~10的所有整数,如果我们在其中加入break会怎么样呢,
我们们看一看下面的代码
#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (5 == i)
		{
			break;
		}
		printf("%d", i);
		i++;
	}
	return 0;
}
这段代码的运行结果变成了1234,输出直接结束了。当我们逐语句调试的时候便会发现,当程序运行到break
处后,下一步直接就退出了这一循环。也就是说,当while循环运行到break处时,会停止一切后续的循环,直
接从该语句跳出循环。
下面我们再看这一段代码
#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (5 == i)
		{
			continue;
		}
		printf("%d", i);
		i++;
	}
	return 0;
}
这段代码的输出结果是1234,在输出四之后,程序也并没有停止,而是陷入了死循环也不再打印任何东西
int main()
{
	int i = 1;
	while (i <= 10)
	{
		i++;
		if (5 == i)
		{
			continue;
		}
		printf("%d", i);
	}
	return 0;
}
我们将代码改成这样,便可在每次进行循环时都能够让i的值发生变化,也就不再会陷入死循环了
当然,也有一种特殊的写法可供我们使用
#include<stdio.h>
int main()
{
	int i = 0;
	while (i++ <= 9)
	{
		if (5 == i)
		{
			continue;
		}
		printf("%d", i);
		i++;
	}
	return 0;
这种写法是将i的调整直接写在判断语句之内,有助于我们降低错误的几率

以上便是break和continue在while循环中的应用了,下面我们再来讲解for循环。

2、for循环

(1)for循环的基本结构

先来看看for循环的基本结构
for(初始化部分;条件判断部分;调整部分)
{
循环语句;
}
可以看到,for循环后面的()内有三种语句
第一种是 初始化部分,用于初始化循环变量
第二种是条件判断部分,用以控制循环的进行与终止
第三种是调整部分,调整循环变量的值

for循环使用起来是比较方便的,比如刚才的打印1~10的程序,我们可以这样写

#include<stdio.h>
int main()
{
	int i;
	for (i = 1; i <= 10; i++)
	{
		printf("%d", i);
	}
	return 0;
}
第一个初始化部分初始化i的值为1,第二个条件判断部分写明了循环进行的条件是i<=10,第三个调整部分
让for循环每次进行的时候i的值都产生+1的变化,最后printf打印每次循环i的值。

(2)break和continue在for循环中的应用

我们看下面的代码,
#include<stdio.h>
int main()
{
	int i;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
		{
			break;
		}
		printf("%d", i);
	}
	return 0;
}
程序的输出结果仍然为1234。由此可见,breakfor循环与while循环中作用一样。

再看continuefor循环中的应用

#include<stdio.h>
int main()
{
	int i;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
		{
			continue;
		}
		printf("%d", i);
	}
	return 0;
程序的输出结果是1 2 3 4 6 7 8 9 10,不输出5.这是由于在for循环中,i++并不是位于continue之后程序遇到
continue会跳过后面的printf语句,并且执行i++,所以输出结果只是没有5,这与将i++提至continue之前的while
循环是一样的。

(3)for循环在使用时的注意事项

接下来讲一些使用for循环时的注意事项
1.一定不要在for循环体内进行变量的修改,防止for循环失去控制,而且这也是编译器无法察觉到的错误
2.一般来说,for循环是要有完整的初始化,判断和调整部分的,如果省略了判断部分吗,那么程序会进入无限循环,如果漏写了其他部分,也会出现相应的问题,以此初学者在使用时最好把三个部分都要写全写好。

再来补充一些for循环的用法

1.用字符代替数字计数
#include<stdio.h>
int main()
{
	char ch;
	for (ch = 'a'; ch < 'z'; ch++)
	{
		printf("%c", ch);
	}
	return 0;
}
程序的输出结果是a,b,c...z。该程序能正常运行到原因是字符在内部一整数形式存储,该循环本质上还是用整数来计数

2.其他测试条件
for(num=1;num*num*num<216;num++)

3.让递增的量几何增长
for(i=1;i<10;i*=1.1)

4.嵌套的for循环
for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			printf("Wub Lub Dub Dub\n");
		}
	}
	这段代码会执行九次循环,输出九个Wub Lub Dub Dub
	
5.用多个变量控制循环
for (i = 0, j = 0; i < 2 && j < 5; ++i, j++)
	{
		printf("wcdc\n");
	}
	这段代码便会执行两次循环,输出两个wcdc

以上便是for循环的基本内容了。

3、do while循环

(1)do while循环的结构

do
{
循环体;
}while(判断语句);

do while 循环最大的特点就是无论条件是否成立,先执行循环一次,然后再进行判断,如果条件为真,进入循环,如果条件为假,不进入循环,需要注意的是,do while 循环while之后有分号,这也是其特殊的地方。

(2)break和continue在do while循环中的应用

我们来看这样一段代码
#include<stdio.h>
int main()
{
	int i = 1;
	do 
	{
		printf("%d", i);
		if (5 == i)
		{
			break;
		}
		i++;
	} while (i <= 10);
	return 0;
}
这段代码的输出结果是1 2 3 4 5,可见break作用为打破循环,与while中一样

再看下面一段代码
#include<stdio.h>
int main()
{
	int i = 1;
	do 
	{
		printf("%d", i);
		if (5 == i)
		{
			continue;
		}
		i++;
	} while (i <= 10);
	return 0;
}
输出结果为1234555555...4之后无限输出5,也是跳过后面的部分直接进入下一循环,与while中一样。

现在我们已经学习了分支与循环,我们也有很多能做的事情了,可以做一些经典的编程题,也可以根据自己的想法来做一些小程序小游戏,具体的这些我会在下一篇文章里详细介绍。

四、goto语句

C语言提供了可以随意滥用的goto语句和标记跳转的标号。从理论山来说goto语句是没有必要的,实践中没有goto语句也很容易写出代码。但是在某些场合下goto还是用的着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如跳出多层循环,代码如下:

for (...)
for (...)
{
	for (...)
	{
		if (disaster)
			goto error;//
	}
}
…
error ://注意goto的使用结构
if (disaster)
对于这样的结构,如果用break一步一步跳出循环就很麻烦了,而使用goto就可以达到比较好的效果


这里分别使用gotoif来写两段代码来实现关机程序
#include <stdio.h>
#include<stdlib.h>
int main()
{
    char input[10] = {0};
    system("shutdown -s -t 60");//这里控制程序60s后关机
    again:
    printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
    scanf("%s", input);
    if(0 == strcmp(input, "我是猪"))
   {
        system("shutdown -a");//这里是解除关机程序
   }
    else
   {
        goto again;
   }
    return 0;

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char input[10] = {0};
    system("shutdown -s -t 60");
    while(1)
   {
        printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
        scanf("%s", input);
        if(0 == strcmp(input, "我是猪"))
       {
            system("shutdown -a");
            break;
       }
   }
    return 0;
}
以上两段代码作用效果相同,都是先输出程序要关机的指令和解除关机的要求,然后接收到我是猪之后取消关机,
这里就不过多阐述了。

好了,本章到此结束了,正如上述,下一章我们将讲解一些经典的编程题,同时也会介绍一些小游戏,来展示这些语句的用法和有趣的使用。
最后需要提上一嘴,这是我的第一篇技术博客,我知道有很多不足的地方,如果您觉得有什么错误的地方欢迎指正,如果有什么想提的建议我也非常感谢。如果我写的这些东西真的对大家有帮助,那真是再好不过了,感谢看到最后的每一个人!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值