超详细讲解分支与循环语句等

发布于:2022-11-06 ⋅ 阅读:(359) ⋅ 点赞:(0)

语句

在开始不同语句的讲解前,我们首先需要知道,什么是语句呢?
C语句可分为以下五类:

  1. 表达式语句
  2. 函数调用语句
  3. 控制语句
  4. 复合语句
  5. 空语句
    而本篇文章后面主要介绍的是控制语句。控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言中支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。
    可分成以下三类:
  6. 条件判断语句也叫分支语句:if语句、switch语句;
  7. 循环执行语句:do while语句、while语句、for语句;
  8. 转向语句:break语句、goto语句、continue语句、return语句。

条件判断语句

条件判断语句也叫做分支语句。举个例子,如果你现在好好学习,最后有一个好技能从而找到一份好工作,走上人生巅峰;如果你不学习,毕业等于失业,只能回家卖红薯。这就是一种选择,亦或者说是一种分支的体现。

if判断语句

对于if语句而言,就是属于一种条件判断语句,那么if语句的语法结构是怎么样的呢?

//单分支
if(表达式)
    语句1;
else
    语句2;
//多分支    
if(表达式1)
    语句1;
else if(表达式2)
{
    语句2;
    语句3;
}    
else
    语句4;

在上面的代码中,大家可以看到if语句分为单分支与多分支两种情况,对于单分支,如果if中的表达式为真,则会进入if所附带的语句1,否则就会进入else中的语句2。对于多分支而言也同样如此。
在这里我需要补充一下,既然表达式的结果为真,会执行语句。那么在C语言中如何表示真假呢?
那就是:0表示假,非0表示真
除此之外,如果条件成立,需要执行多条语句,则应该使用代码块 ,就像上述代码中写的一样。若不是用代码块,则只会默认执行if或者else等后面的第一条语句,这对于后面的while循环也是一样的。

else if(表达式2)
{
    语句2;
    语句3;
}    //这里的一对{}就代表了代码块

用代码进行举例。

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

需要指出的是,对于三个同时为if的情况与上述的if,else if 与else是不同的,大家需要注意这种情况。

if(表达式1)
     语句1if(表达式2)
     语句2if(表达式3)
     语句3

上述的情况,在多个if语句中,所有的if都会进行判断,无论是否满足情况。在if else if else中,只要有一个条件满足,则其余条件不用判断,会直接跳过。
举个例子:

#include <stdio.h>
int main()
{
	int a = 0;
	if (a == 0)
	{
		a++;
		printf("haha");
	}
	if (a == 1)
	{
		a++;
		printf("hehe");
	}
	if (a == 2)
	{
		printf("hihi");
	}
}
最终输出的结果是hahahehehihi。这是因为在多个if语句中,所有的if都会进行判断。
无论第一个语句是否满足情况.在满足表达式时就会执行。
例如一开始a=0进入第一个if后执行了a++,a就变成了1,当进行a==1判断时,也符合,故也执行了第二个if语句。
同理再次a++后a=2,同样执行了第三个if语句。
-------------------------------------------------
#include <stdio.h>
int main()
{
	int a = 0;
	if (a == 0)
	{
		a++;
		printf("haha");
	}
	else if (a == 1)
	{
		a++;
		printf("hehe");
	}
	else
		printf("hihi");
}
此段代码最终只输出了haha。在if else if else,只要有一个条件满足,则其余条件将不会继续进行判断,会直接跳过。
上述代码a=0进入if语句,则执行完if语句后次选择分支结束。

switch判断语句

switch语句可以类比为类似于电路里的开关选择型语句,是一种多分支选择结构,一般与case、break、default配合使用。
switch语句的格式如下:

switch (表达式) 
{
case 常量表达式1:  
	语句1;
case 常量表达式2:  
	语句2;
	……
case 常量表达式n:  
	语句n;
default:  语句n + 1;
}

其中switch、case、break、default等都是关键词。当switch变量表达式的值对应case中的某个值时,将会执行case后面的语句,在这之后若加入了break则会终止switch语句。如果未有符合的case表达式,则会执行default语句后再跳出switch语句。
但在使用switch语句时,需要注意以下几点:
1、使用switch必须是基本数据类型中的整型类型,例如int类型。
2、使用case的表达式必须为常量表达式,例如case 1;
3、case语句后允许存在多个语句而不使用代码块。
4、对于case语句,若不在其后面语句执行完后加入break;,则会发生依次进入case语句中执行命令,break语句则正是用于终止并跳出switch语句的。
5、default语句从某种意义上没有顺序要求,可以放到开头也可以结尾,但一般建议放结尾。
以我写的猜数字的部分代码为例;

switch (input)
		{
		case 1:
			printf("游戏开始!!\n");
			game();
			break;
		case 2:
			printf("退出游戏!!\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;

循环执行语句

if语句仅会循环一次,但事实上我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次,因此便出现了循环执行语句,顾名思义进行循环。

while循环语句

while循环语句的结构:

while (表达式)
{
	循环语句1;
	循环语句2}

例如输出1-10的数字:

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

又例如实现多组数据输入:

while (scanf("%d %d", &a, &b) != EOF)

而while循环中同样存在break语句与continue语句。
break语句:执行后停止后面所有的循环即终止循环。
continue语句:终止本次循环,也就是本次循环中continue后边的代码不会再执行,但会再次回到循环语句判断部分。

for循环语句

for循环语句比while循环语句更加便捷(个人认为)
for循环的语法结构:

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

表达式1为初始化部分,用于初始化循环变量。
表达式2为条件判断部分,用于判断循环时候终止。
表达式3为调整部分,用于循环条件的调整。
而实际情况上可能会出现表达式1或表达式2不填的情况。
使用for循环输出1~10数字:

#include <stdio.h>
int main()
{
 int i = 0;
 //for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
 for(i=1; i<=10; i++)
 {
 printf("%d ", i);
 }
 return 0;
}

除此之外,对于for语句的循环控制变量的取值更建议采用“前闭后开区间”写法。

int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}

除此之外,for循环的一些更综合应用写法可以达到类似于某行某列的输入,跟二维数组有些相像,例如,输出99乘法表。

int main()
{
	int lin = 0;
	int col = 0;
	int product = 0;
	for (col = 1; col < 10; col++)//控制列
	{
		for (lin = 1; lin <= col; lin++)//控制行
		{
			product = col * lin;
			printf("%d*%d=%d ", col,lin,product);
		}
		printf("\n");
	}
}

do…while循环语句

do…while相比而言用的频率没有那么高,因此简约介绍。其循环至少会循环一次。
do语句的语法:

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

用代码举例:

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

转向语句

转向语句是用来直接控制程序的执行流程,可用于改变switch选择、for循环、while循环、do-while循环等。

goto语句

goto语句本质上是可以随意滥用的跳至某一位置的语句。从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。但存在即合理,某些场合下仍然需要使用goto语句,其最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。例如:一次性的跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

for(...)
    for(...)
   {
        for(...)
       {
            if(disaster)
                goto error;
       }
   }
    …
error:
 if(disaster)
         // 处理错误情况

网站公告

今日签到

点亮在社区的每一天
去签到