分支和循环语句

前言

       之前因为各种原因导致许久未更新博客,之后不会再出现这种情况了,我会在这里持续更新我的学习心得,今天打算讲一讲分支和循环语句。


一、分支与循环语句的简介

      众所周知,c语言有顺序、选择、循环三种结构,不同的结构需要不同的语句来引入。对于选择结构,需要if、switch来牵引;对于循环结构,需要for,while,do while来牵引,此外还有一些词能起到转向的作用,比如break、go to、continue、return等。上述的内容将在以下正文一一说明。

二、分支与循环语句详细介绍

1.if语句

1.1.if语句的基本形式

if ( 表达式 )
{
     语句
}

其中if语句中的表达式需要为真,简单来说就是非零,因为if只会执行“真”。

基本逻辑:

例如:输入一个数判断是否是4的倍数

#include <stdio.h>  

int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a % 4 == 0)
	{
		printf("%d", a);
	}
    return 0;
}

对于上述代码有一点需要注意的是,“==”才表示判断相等而“=”则是赋值的意思

1.2.if/else

对于上述代码若输入的数字不是4的倍数,那么代码执行之后是不会显示的,那么对于这个情况,我们需要引入if/else语句,其基本形式如下:

if(表达式)
{
    语句1
}
else
{
    语句2
}

因此对于上述判断是否为4的倍数,我们可以进行以下完善:

#include <stdio.h>  

int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a % 4 == 0)
	{
		printf("%d是4的倍数", a);
	}
	else
	{
		printf("%d不是4的倍数", a);
	}
	return 0;
}

值得注意的是if/else语句默认地只控制一个语句,比如下列代码,不管a是不是4的倍数,“a不是4的倍数”都会被打印下来。

#include <stdio.h>  

int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a % 4 == 0)
	    printf("%d是4的倍数", a);
	    printf("%d不是4的倍数", a);
	return 0;
}

1.3嵌套if

在 if/else 语句中,else可以与另⼀个if语句连⽤,从而构成多重判断。

例如当一个人颜值大于等于80是很好看,小于等于60是一般,60到80是好看:

方法一:

#include <stdio.h>  

int main()
{
	int appearance = 0;
	scanf("%d", &appearance);
	if (appearance<=60)
	{
		printf("长得一般");
	}
	else if(appearance<=80)
	{
		printf("长得好看");
	}
	else
	{
		printf("长得很好看");
	}
	return 0;
}

方法二:

#include <stdio.h>  

int main()
{
	int appearance = 0;
	scanf("%d", &appearance);
	if (appearance<=60)
	{
		printf("长得一般");
	}
	else
	{ 
		if (appearance <= 80)
		{
			printf("长得好看");
		}
		else
		{
			printf("长得很好看");
		}
	}
	
	return 0;
}

其实不难看出,方法一是方法二的简写。

1.4悬空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;
}

上述代码运行之后,很多人会认为a是0,不等于1,那就执⾏else⼦句,打印 haha,但是实际情况是什么都不会显示,因为else一般之后与最近的if相对应,比如上述的else会和i第二个f对应,因此当第一个if的表达式被判断为假之后,就直接跳出程序了,因此什么都不会显示。那么改如何修改呢?

方法一:

#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;
}

方法二:

#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;
}

因此从上述方法中我们可以看出大括号的重要性!

2.关系操作符

2.1概念

C 语⾔⽤于⽐较的表达式,称为 “关系表达式”(relational expression),⾥⾯使⽤的运算符就称 为“关系运算符”(relational operator),主要有下⾯6个。它们都是从左到右运算的。

1.> ⼤于运算符

2.< ⼩于运算符

3.>= ⼤于等于运算符

4.<= ⼩于等于运算符

5.== 相等运算符  

6.!= 不相等运算符

其中具体一点来说,关系表达式通常返回0或1,表⽰真假。C语⾔中,0表⽰假,所有⾮零值表⽰真。⽐如,20 > 12 返回1,12 > 20返回0。而关系表达式通常运用与if与while结构。

2.2注意

1.刚刚也有提到过,就是“==”才表示判断相等而“=”则是赋值的意思

2.多个操作符不宜连用,比如一个表达式:"a>b>c",看似想表达的是a大于b大于c,但是由于关系操作符是从左向右运算的,它实际执行的是”(a>b)>c"而如果a>b,那么括号的结果是1,接下来就会比较1与c的大小,返回结果是1或者0;a<b那么括号的结果是0,同理返回结果是1或者0。不管怎么样都与我们的目的相违背,那么如果想要达到我们比较a,b,c的目的,我们可以加入逻辑与操作符"&&",比如要说明a大于b大于c,我们可以把表达式写成"a>b&&b>c"。

3.条件操作符

3.1概念

条件操作符也叫三⽬操作符,需要接受三个操作数,其基本形式如下:

exp1 ? exp2 : exp3

条件操作符的计算逻辑是:如果 exp1 为真,exp2 计算,计算的结果是整个表达式的结果;如果 exp1 为假,exp3 计算,计算的结果是整个表达式的结果。例如:

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d", &a);
	(b = a > 5 ? 3 : -3);
	printf("%d\n", b);
	return 0;
}

上述代码的意思是,输入一个a值,如果a>5成立,那么也就是说"exp1"表达式成立,那么就走"exp2",最后输出的值是3,反之则为-3,然后再将a的值赋值给b,最后打印b的值。

上述代码如果用if/else表达的话是:

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d", &a);
    if (a > 5)
        b = 3;
    else
        b = -3;
    printf("%d\n", b);
    return 0;
 }

4.逻辑操作符

4.1概念

逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。

! :逻辑取反运算符(改变单个表达式的真假)。

&& :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。

|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。

其中,非零表示为真,零表示为假。

4.2 逻辑取反运算符 !

这是三个运算符中最简单的,只起到一个改变真假的作用,比如a为真,那么!a就为假。

#include <stdio.h>
int main()
{
	int a = 0;
	if (!a)
	{
		printf("haha");
    }
	return 0;
}

上述的代码最后打印的就是haha,因为!a是非零的,if后的表达式如果是真的那么就会执行,因此最后的结果是haha。

4.3与运算符 &&

&& 就是与运算符,也是并且的意思, && 是⼀个双⽬操作符,使⽤的⽅式是 a&&b , && 两边的表达 式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。这个和数学中的"或"基本类似。

⽐如:如果我们说18岁到44岁是青年,那使⽤代码怎么体现呢?

#include <stdio.h>
int year = 0;
scanf("%d", &year);  
if(year >= 18 && year <= 44)
{
    printf("青年\n");
 return 0;
}

这个代码就是说,year需要满足既大于等于18岁又要小于等于44岁。

4.4或运算符||

|| 就是或运算符,也就是或者的意思, || 也是⼀个双⽬操作符,使⽤的⽅式是 a || b , || 两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。

⽐如:我们说一年级和二年级是小学的低年级,那么我们怎么使⽤代码体现呢?

#include <stdio.h>
int main()
{
  scanf("%d",nianji);
  if(nianji=1||nianji=2)
    {
       printf("低年级");
    }
  return 0;
}

4.5短路问题

C语⾔逻辑运算符还有⼀个特点,就是它会从左向右运算。 如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。

这个是比较好理解的,比如在&&运算符的举例中:

year >= 18 && year <= 44

如果输入的year的值小于了18的话,那么就不需要进行后续和44的比较了,从和18比较那就结束了。

又比如在||运算符的举例中:

nianji=1||nianji=2

如果输入的nianji等于1,那么它只会和前面的式子相比较,就不会进入后续和2比较的程序了。

5.switch语句

5.1概念

switch语句可以实现分支结构,但是它可以看成一种特殊的if/else的语句,⽤于判断条件有多个结果的情况。可以理解为它把多重的if/else 改成更易⽤、可读性更好的形式。

它的基本形式是:

switch (表达式) 
{
 case (1): 语句1
    break;
 case (2): 语句2
    break;
.
.
.
 default: 语句n
    break;
}

注:1. switch 后的表达式必须是整型表达式,case 后的语句,必须是整形常量表达式。

       2.case 和后边的数字之间必须有空格。

       3.(1)、(2)是指和表达式相匹配的情况。

上⾯代码中,根据表达式中不同的值,执⾏相应的case 分⽀。如果找不到对应的值(就是说情况和所有的case都不匹配的时候), 就执⾏ default 分⽀,但是case和default其实是没有固定的顺序要求的,代码的执行是从下往上的,只要能实现我们的想法就好了,但是一般来说,default会放在最后。

5.2switch中的break

break在switch语句中的作用是跳出程序。

例如:

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

在上述例子中如果没有break,如果输入的day的值是1,那么打印的结果会是1 2 3 4。而不是我们想要的一个单独的1。也就是说它不会跳出来。

但是我们可以利用这个原理简化一些代码,比如输入12、1、2月是冬天;3、4、5月是春天;6、7、8月是夏天;9、10、11月是秋天。

#include <stdio.h>
int main()
{
	int month = 0;
	scanf("%d", &month);
	switch (month)
	{
	   case 12:
	    case 1:
		case 2:
			printf("冬天\n");
			break;
		case 3:
		case 4:
		case 5:
			printf("春天\n");
			break;
		case 6:
		case 7:
		case 8:
			printf("夏天\n");
			break;
		case 9:
		case 10:
		case 11:
			printf("秋天\n");
			break;
	}
	return 0;
}

5.3if语句和switch语句对比

举一个例子来对比两个语句就比较直观能看出switch可以简化if语句了。

比如输入一个整数,计算除4后的余数

if:

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	if (n % 4 == 0)
		printf("整除,余数为0\n");
	else
	{
		if (n % 4 == 1)
		{
			printf("余数是1\n");
		}
		else if (n % 4 == 2)
		{
			printf("余数是2\n");
		}
		else
			printf("余数是3\n");
	}
	return 0;
}

switch:

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	switch (n % 4)
	{
	case 0:
		printf("整除,余数为0\n");
		break;
	case 1:
		printf("余数是1\n");
		break;
	case 2:
		printf("余数是2\n");
		break;
	case 3:
		printf("余数是3\n");
		break;
	}
	return 0;
}

其实不难看出,switch语句的使用让整个代码看起来更好理解并且简单一些。

6.while循环

6.1概念

while语句和if语句十分类似,它实际上是一种循环,其的形式是:

1.while(表达式)
2. 语句;

注:如果循环体想包含更多的语句,可以加上⼤括号。

#include <stdio.h>
int main()
{
  int a = 0;
  scanf("%d",&a);
  if(a==1)
      printf("hehe\n"); 
  return 0;
}

如果if后边条件满⾜,打印⼀次hehe,但是如果把if换成while,那么hehe会被一直循环打印。

6.2详解

while语句执行完一次程序之后会重新进入while后面那个表达式进行判断,如果判断为0(假)那么循环就会停止;如果判断为非0(真)那么会继续进行,直到判断为0为止。但是如果执行到某个循环中出现了break,那么程序也会直接跳出循环,下面举个很经典的例子,打印数字一到十:

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

7.for循环

7.1概念

for循环因为其足够的简介,因此使用的频率较高,其基本形式如下:

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

表达式1 ⽤于循环变量的初始化

表达式2 ⽤于循环结束条件的判断

表达式3 ⽤于循环变量的调整

7.2详解

⾸先执行表达式1初始化循环变量,接下来就是执行表达式2的判断部分, 表达式2的结果如果 ==0(假),则循环结束;表达式2的结果如果不等于0则继续执⾏循环语句,循环语句执行完后,再去执行表达式 3 ,调整循环变量,然后再去表达式2的地方执行判断, 表达式2的结果是否为0,决定循环是否继续。 整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。

再按照打印一到十来举例:

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

7.3while循环与for循环对比

针对上述两个打印从一到十的例子,我们可以对比一下while循环和for循环:

从上图可以看出,while循环和for循环有很大的类似,都有初始化、判断、调整,但是不难看出,for循环比while循环简洁很多,而while循环的三个部分比较分散,所以while循环更好一些。

8.do-while循环

8.1概念

不同于for循环和while循环,do-while循环是不管三七二十一,一进入就执行一次循环,然后再执行while 后的判断表达式,若表达式为真,就会进行下⼀次,若表达式为假,则不再继续循环。其基本形式如下:

1.do
2. 语句;
3.while(表达式);

还是拿打印1到10举例:

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

	return 0;
}

上述代码中,先执行一次打印,因此对于i的初始化应当设置成1,而while的判断条件则是i小于等于10。

9.break与continue

9.1概念

通常在循环程序执行的过程中,我们往往并不想程序一直执行完,因此引入了break和continue的概念。

break的作用是用于永久的终止循环,只要 break被执行,直接就会跳出循环,继续往后执行。

continue的作用是跳过本次循环continue后边的代码,在for循环和while循环中有所差异的。

9.2详解

还是拿打印1到10举例:

break:

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

这个例子中,最后的结果会是1 2 3 4。因为当i等于5的时候,整体就跳出循环了,为什么不打印5呢?因为break在printf之前。

continue:

如果把上述代码的break换成continue:

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

那么它的打印结果会是1 2 3 4 6 7 8 9 10。因为continue是继续的意思,也就是说上述代码中当i等于5那么跳出此次循环,继续下一次循环,因此就不会打印5。它和break一个很大的差别就是break是跳出所有循环,而continue是跳出此次循环继续下一次循环。、

10.goto语句

10.1概念

“go to”的意思的“去”,因此在程序中它很特殊,有跳转的意思,它往往和跳转符号相搭配,跳转符号可以自定义。

#include <stdio.h>
int main()
{
	printf("1\n");
	goto happy;
	printf("2\n");

happy:
	printf("3\n");
	return 0;
}

上述代码中跳过了“printf("2\n")”这一行代码,因此只会打印1 3这两个V

goto语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程。但是goto语句的使用也会带来一定的便利,因此对于goto语句的使用要慎重。

10.2作用

goto语句一个很大的作用就是当在多层嵌套函数中,想跳出几层函数到另外一层函数的时候,用break显然是不方便得到目的的,这个时候就可以用goto语句。例如:

for (...)
{
	for (...)
	{
		for (...)
		{
			if (disaster)
				goto error;
		}
	}
}
error:

本来for循环想提前退出得使用break,⼀个break只能跳出⼀层for循环,如果3层循环嵌套就得使⽤3个break才能跳出循环,所以在这种情况下我们使用goto语句就会更加的快捷。


总结

上述的几种循环并不是单独的,为了更好的处理问题,往往需要将几个循环嵌套使用才能更好地达成目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值