详细讲解 —— 分支和循环语句(C语言初阶)

目录

分支语句(选择结构)

1、if语句

2、if语句 - 常见问题代码

3、if语句练习

4、switch语句

 switch中break的应用

switch 中的 default 子句

一道练习题

 循环语句

1、while循环

while语句中的break

while语句中的continue

2、for循环

break和continue在for循环中

for循环的变种

一道笔试题:

3、do...while ( ) 循环

do while循环中的break和continue

4、goto语句


分支语句(选择结构)

1、if语句

if语句的语法(三种正确用法)

语法结构:
//第一种用法
if(表达式)
    语句;

//第二种用法
if(表达式)
    语句1;
else
    语句2;


//多分支(第三种用法)
if(表达式1)
    语句1;
else if(表达式2)
    语句2;
else
    语句3;

补充:

什么是语句:c语言中用分号(;)隔开的就是一条语句。

if后面只能跟着一个语句,如果跟着多个语句就要用到代码块( { } ),但是有时候为了简洁明了就算有一个语句也加上代码块。

第一种用法:

#include<stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num <= 18) //判断:如果为真就进入执行代码块的内容,为假就代码块的内容就不执行
	{
		printf("未成年");
	}
	return 0;
}

第二种用法

#include<stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num <= 18) //判断:条件为真执行if语句后面代码块的内容(不执行else后面的内容)
	{              //条件为假执行else语句后面代码块的内容(不执行if后面的内容)
		printf("未成年");
	}
	else
	{
		printf("成年");
	}
	return 0;
}

第三种用法

int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num <= 18)
		printf("未成年\n");
	else if (num > 18 && num <= 30)
		printf("青年\n");
	else if (num > 30 && num <= 50)
		printf("壮年\n");
	else if (num > 50 && num <= 70)
		printf("中老年\n");
	else if (num > 70 && num <= 100)
		printf("老年\n");
	else
		printf("老不死的\n");
	return 0;
}
//其中判断:只要其中的一项符合条件,代码就跳出去。

2、if语句 - 常见问题代码

第一种:效率降低

int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num <= 18)
		printf("未成年\n");
	if (num > 18 && num <= 30)
		printf("青年\n");
	if (num > 30 && num <= 50)
		printf("壮年\n");
	if (num > 50 && num <= 70)
		printf("中老年\n");
	if (num > 70 && num <= 100)
		printf("老年\n");
	if(num >100)
		printf("老不死的\n");
	return 0;
}

这个代码也是能跑起来的但是效率没有上面 if - else if - else 的效率高

上面的 if - else if - else 只要判断一个条件成立就跳出去。

而这个代码每一个都要判断。

第二种

#include<stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num <= 18)
		printf("未成年");
	else                 //下面这条语句要用到代码块
		printf("成年");
        printf("可以谈恋爱");
	return 0;
}

这个语句是错误的:if和else后面只能跟着一条语句,跟多条语句要用到代码块

第三种

#include<stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (10 < num <= 18) //输入数字为30 —— 30大于10 —— 为真 —— 真为1 —— 1小于18 —— 真(执行)
		printf("未成年");//输入数字为5 —— 5小于10 —— 为假 —— 假为0 —— 0小于18 —— 真(执行)
	else
		printf("成年");
	return 0;
}

这个代码无论你输入什么样的数字都会打印未成年。

第四种:这个代码的风格有一点问题(容易产生歧义)

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
        if(b == 2)
            printf("hehe\n");
    else                 //else和离他最近的if相匹配。
        printf("haha\n");
    return 0;
}


这个代码如果不想产生歧义可以这样写
#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;
}

3、if语句练习

(1)判断一个数是否为奇数

(2)输出1 —— 100之间的奇数

下面是两个练习的代码:

//判断一个数是否为奇数
#include<stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	if (n % 2 == 1)
	{
		printf("奇数\n");
	}
	else
	{
		printf("偶数\n");
	}
	return 0;
}

//输出1 — 100之间的奇数
#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 100)
	{
		if (i % 2 == 1)
			printf("%d ", i);
		i++;
	}
	return 0;
}

4、switch语句

 Switch语句也是一种语句,长长用于多分支的情况。

比如:输入一个数字,然后打印星期几(输入1,输出星期一......)

如果要写成 if...else if ...else if 的形式,太复杂了,这时就可以用switch 语句。

switch(整型表达式)    //这里面的整型表达式只能放整数,不能放浮点数
{
    case(整型常量表达式):
         语句;
}

其中switch语句中可以包含多个case语句

 switch中break的应用

#include<stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:   //从case(整型常量表达式)进入 
		printf("星期一\n");
		break;   //遇见break从switch中出来 —— 如果没有遇见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;
}

需求更改:

1. 输入1-5输出的是“weekday”

2. 输入6-7输出“weekend”

#include<stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("weekday\n");
		break;
	case 6:
	case 7:
		printf("weekend\n");
		break;
	}
	return 0;
}

 break语句的实际效果是把语句列表划分为不同的部分。

switch 中的 default 子句

(1)如果表达的值与所有的case标签的值都不匹配,程序并不会终止,也不会报错,因为这种情况在C中并不认为适合错误。

(2)你可以在语句列表中增加一条default子句,当 switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。

(3)每个switch语句中只能出现一条default子句。

(4)它可以出现在语句列表的任何位置。

一道练习题

#include <stdio.h>
int main()
{
    int n = 1;
    int m = 2;
    switch (n)
   {
    case 1:
            m++;
    case 2:
            n++;
    case 3:
             switch (n)   //switch允许嵌套使用
           {
             case 1:
                    n++;
             case 2:
                    m++;
                    n++;
                    break;
           }
    case 4:
            m++;
             break;
    default:   //如果n != 1 2 3 4,则执行这条语句
             break;
   }
    printf("m = %d, n = %d\n", m, n);
    return 0;
}
//最终打印的值为m = 5, n = 3。

 分析:

#include <stdio.h>
int main()
{
    int n = 1;
    int m = 2;
    switch (n)   //n = 1 —— 进入 case 1:
   {
    case 1:
            m++;   //m = 3
    case 2:
            n++;   //n = 2
    case 3:
             switch (n)   //n = 2 —— 进入 case 2:
           {//switch允许嵌套使用
             case 1:
                    n++;
             case 2:
                    m++;   //m = 4
                    n++;   //n = 3
                    break;   //跳出case 3:中的 switch 语句 —— 进入case 4:
           }
    case 4:
            m++;   //m = 5
             break;   //跳出 switch 语句
    default:
             break;
   }
    printf("m = %d, n = %d\n", m, n);   //m = 5, n = 3
    return 0;
}

 循环语句

1、while循环

 有时候我们遇到有一个事情要我们反复的去做。

C语言中给我们引入了:while语句,可以实现循环。

while(表达式)
 循环语句;

 举例:在电脑上打印1到10的数字。

#include<stdio.h>
int main()
{
	int i = 0;
	i = 1;
	while (i <= 10)
	{
		printf("%d ", i); //打印值为1 2 3 4 5 6 7 8 9 10 
		i++;
	}
	return 0;
}

while语句中的break

 break在while循环中的作用:

循环中只要遇到break,就停止后期的所有的循环,直接终止循环。

while中的break是终止所有循环,直接跳出循环。

举例:

#include<stdio.h>
int main()
{
	int i = 0;
	i = 1;
	while (i <= 10)
	{
		if (i == 5)       //当i = 5是执行break语句,直接终止后面的所有循环
			break;
		printf("%d ", i);//最终屏幕上打印值是1 2 3 4
		i++;
	}
	return 0;
}

while语句中的continue

continue在while循环中的作用:

continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

举例:

#include<stdio.h>
int main()
{
	int i = 0;
	i = 1;
	while (i <= 10)
	{
		if (i == 5)//当i = 5时,执行continue语句, 不执行i++语句——所以之后i的值一直是5(死循环)
			continue;
		printf("%d ", i);//打印值为1 2 3 4  然后死循环
		i++;
	}
	return 0;
}
#include<stdio.h>
int main()
{
	int i = 0;
	i = 1;
	while (i <= 10)
	{
		i++;
		if (i == 5)       //当i = 5时执行continue语句
			continue;
		printf("%d ", i); //打印值为2 3 4 6 7 8 9 10 11,中间没有打印5
	}
	return 0;
}

2、for循环

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

表达式1为初始化部分,用于初始化循环变量的。

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

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

for循环和while循环:实现打印1到10的数字。

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


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

可以发现在while循环中依然存在循环的三个必须条件

但是由于风格的问题使得三个部分很可能偏离 较远,这样查找修改就不够集中和方便。

所以,for循环的风格更胜一筹。

for循环使用的频率也高。

break和continue在for循环中

举例:

//for循环 —— break
#include <stdio.h>
int main()
{
   int i = 0;
   for(i=1; i<=10; i++)
   {
      if(i == 5)
         break;
      printf("%d ",i);   //打印值为1 2 3 4
    }
 return 0;
}


//for循环 —— continue
#include <stdio.h>
int main()
{
   int i = 0;
   for(i=1; i<=10; i++)
   {
      if(i == 5)
         continue;     //当i == 5时,执行continue,直接跳到 —— (调整部分)i++(i的值能改变)
      printf("%d ",i);   //打印值为1 2 3 4 6 7 8 9 10
   }
 return 0;
}

一些建议:

1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。

2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。(可以仔细感受下面两种写法)

int i = 0;

//前闭后开的写法
for(i=0; i<10; i++)
{

}

//两边都是闭区间
for(i=0; i<=9; i++)
{

}

for循环的变种

变种1

#include <stdio.h>
int main()
{
   for(;;)
   {
       printf("hehe\n");
   }
   return 0;
}

上面这个代码死循环:

分析:初始化、条件判断、调整部分都是可以省略的,但是条件判断省略表示条件判断一直为真。所以上面这个代码的死循环

建议:尽量不要省略  初始化、条件判断、调整部分  因为有可能会出现意想不到的结果

举例:

//不省略
#include<stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			printf("haha\n");   //打印100个haha。
		}
	}
	return 0;
}


//省略
#include<stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (; i < 10; i++)
	{
//分析:当i = 0时 —— j从0变到10 —— 10不满足条件就会退出第二层循环
//当执行i++,i = 1时 —— j这时还是10(没有初始化成0)进入第二层 —— 不满足条件退出第二次循环
//同理:i = 3时,也一样 —————— 最后打印10个haha
		for (; j < 10; j++)
		{
			printf("haha\n");  //打印10个haha。
		}
	}
	return 0;
}

 变种2

#include <stdio.h>
int main()
{ 
 int x, y;
    for (x = 0, y = 0; x<2 && y<5; ++x, y++)
   {
        printf("hehe\n");   //打印两个hehe
   }
 return 0;
}

一道笔试题:

//请问循环要循环多少次?
#include <stdio.h>
int main()
{
 int i = 0;
 int k = 0;
 for(i =0,k=0; k=0; i++,k++)
        k++;
 return 0;
}

答案 :0次

分析:这里要注意 k = 0 和 k == 0 的区别,k = 0 表示把0赋值给k  0表示假  不执行, k == 0 表示如果 k的值等于 0 —— 语句执行,否则不执行。

3、do...while ( ) 循环

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

do...while ( ) 循环最少执行一次程序。使用的场景有限,所以不是经常使用。

do while循环中的break和continue

#include<stdio.h>

int main()
{
	int i = 1;
	do
	{
		printf("%d ", i);   //打印值为1 2 3 4
		if(5 == i)
			break;
		i++;
	} while (i <= 10);
	return 0;
}


#include<stdio.h>

int main()
{
	int i = 1;
	do
	{
		printf("%d ", i);   //打印值为1 2 3 4 + 5的死循环
		if(5 == i)
			continue;
		i++;
	} while (i <= 10);
	return 0;
}

4、goto语句

C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。

从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。

但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过 程,例如一次跳出两层或多层循环。

这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

下面是使用goto语句的一个例子:

for(...)
    for(...)
   {
        for(...)
       {
            if(disaster)
                goto error;
       }
   }
    …
error:   //利用goto跳出多层循环
 if(disaster)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT技术博主-方兴未艾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值