【C语言学习笔记】--选择控制与循环控制(未完成版,后续慢慢补全)


前言

主要内容
1.if-else语句
2.关系运算符、逻辑运算符
3.switch语句
4.跳转语句
5.三大循环语句:for、while和do-while
6.goto语句


一、选择控制语句

1.1 if语句

首先我们先来看一下if语句的基本格式:

一些语句......
if(表达式)
{
	语句1;
	语句2;
	......
}
一些语句......

if的使用往往是用来选择是否要下面大括号中的语句,用于选择控制。
如果圆括号里面的表达式为,则执行大括号内的语句;否则为不执行,直接跳过执行下面的语句。

C语言中真假的判断:0为假,非0即真

下面用一个例子来看一看if的用法

例1:判断一个数是否是偶数?

#include <stdio.h>
int main()
{
	int num; //判断的数字
	scanf("%d", &num);
	
	if(num % 2 == 0)
	{
		printf("偶数!\n");
	}

	return 0;
}

简单的 if 语句可以控制程序选择执行或者跳过一条或多条语句,那么如果用户输入的是一个奇数,上面则不会执行大括号内的语句,运行程序会发现控制台上什么也没有打印出来,但是用户又想要控制台上打印出不符合预期会出现的其他信息,这个时候就需要用到 if 的搭档 else 了。

注意:这里说的一条或多条语句是指如果 if 下面只有一条语句时,可以省略大括号;如果要让if
选择执行多条语句的时候,一定要带上大括号把要执行的语句包括在内!

1.2 if-else语句

改写例1:

#include <stdio.h>
int main()
{
	int num; //判断的数字
	scanf("%d", &num);

	if (num % 2 == 0)
		printf("%d是偶数!\n", num);
	else
		printf("%d是奇数!\n", num)return 0;
}

单个else和if结合使用的时候,如果 if 里面的表达式为假,则直接跳过 if 下面的语句,转到 else 下面的语句执行。
通过单词 if 和 else 的意思“如果”和“否则”,也可以理解如果为真,执行;否则为假,执行。

再通过一个例子学习 if-else 语句
例2:判断年龄是否成年?

#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);

	if (age >= 18)
		printf("已成年!\n");
	else
		printf("未成年\n");
		
	return 0;
}

程序运行后,如果用户输入的年龄大于等于18,则打印已成年!否则打印未成年!

1.3 多重选择else if

在生活中,我们通常需要做出很多选择。在程序中我们依然可以用 else if 扩展 if else 结构来模拟更多的选择。下面就是一个学生时代最常用的一个例子:

例3:判断成绩是处于哪一个阶段?

#include <stdio.h>
int main()
{
	int score = 0;
	scanf("%d", &score);

	if (score >= 90)
		printf("优秀!\n");
	else
	{
		if (score >= 80)
			printf("良好!\n");
		else
		{
			if (score >= 60)
				printf("合格!\n");
			else
				printf("不合格!\n");
		}
	}

	return 0;
}

用户运行程序读取输入成绩,如果成绩大于等于90,则程序会进入第一个 if 的语句打印优秀!否则表示小于90,则进入 else 的语句中,在 else 语句中再 if 判断如果成绩大于等于80,则进入该 if 的语句打印良好!否则表示小于80,则继续进入内层的 else 语句中,在该 else 语句中判断如果成绩大于等于60,则进入该 if 中的语句打印合格!否则表示小于60,则进入最后的 else 语句中打印不合格!最后程序结束。

小提示:上面提到过如果 if 或者 else 下面的语句只有一条时,可以省略大括号。又因为在C语言中,可以把 if 和对应的语句看成一个整体当成一条语句,if-else 两块的语句合起来也可以看做是一个整体,并且回车和空格在C语言中其实就是为了分隔代码,是为了代码的可读性。所以上述代码可以简化,简化如下:

简化后:

#include <stdio.h>
int main()
{
	int score = 0;
	scanf("%d", &score);

	if (score >= 90)
		printf("优秀!\n");
	else if (score >= 80)
			printf("良好!\n");
	else if (score >= 60)
				printf("合格!\n");
	else
		printf("不合格!\n");

	return 0;
}

1.4 嵌套if

1.3小节中未简化的代码,实际上就是嵌套if的一种形式,从一系列选项中选择一个执行。有时,选择一个特定的的选项后又引出其他的选择,这种情况可以使用另一种形式,即嵌套if。举例说明:

例4:判断数字是否是正数,再判断其是否是偶数,并输出;如果不是正数,则输出:非负数。

#include <stdio.h>

int main()
{
	int num = 0;
	scanf("%d", &num);

	if (num > 0)
	{
		if (num % 2 == 0)
			printf("%d是偶数!\n", num);
		else
			printf("%d是奇数!\n", num);
	}
	else
	{
		printf("非正数!\n");
	}
	
	return 0;
}

用户输入一个数,如果用户输入的数字大于0,则进行更多的判断,判断奇偶性;如果小于等于0,则直接大于非正数!
上面的代码中的第二个if就是第一个if的嵌套,构成了嵌套if的结构。
有了这个结构,可以实现一层套一层,就可以完成更多复杂的逻辑判断了。

1.5 else和if的匹配问题

这里是初学者容易犯错的一个地方!当有多个ifelse时,会无法搞清楚else是和哪一个if进行匹配以至于出现判断出错。
这里可以记住一个原则:就近原则
举例说明:可以看一下下面的代码运行后会是什么结果。

例5:判断else和哪一个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;
}

这段代码的运行结果会是什么呢?很多初学者刚开始可能会看 a == 1这个表达式判断为假,那就不执行下面的 if 语句,直接跳过执行 else里面的语句,然后打印HaHa,但是运行之后会发现什么都没有打印,就会感到很困惑,这是为什么呢?
这就是上面小提示中提到的一个C语言的特点,C语言中的空行,缩进,空格都不会影响代码的结构,这些东西只是为了提高代码的可读性,是C语言编写代码时的一种标准风格。所以不要看else和最开始的if是缩进在同一处的就认为是上面的if相匹配,而是根据上面说的就近原则,else是和中间的if相匹配,而且可以把中间的if-else当成一个整体看成是一条语句,外层的if可以省略大括号,所以当第一个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;
}

小提示:

  1. 适当的空行和缩进,可以提高代码的可读性。空行用于隔开代码,把功能相关性较强的代码部分放一块,用空行与其他代码分隔开,提高可读性。缩进用于同一结构的代码,将代码缩进到同一级,可以让根据测试条件的求职结果来判断要执行哪部分语句一目了然。
  2. 大括号表示括号内的语句属于一个块,防止出现应该是在括号内执行的语句被当成括号外的语句执行,以此来提高可读性。所以适当的大括号,可以让代码的分区更清晰,建议初学者不管可不可以省略大括号,只要是使用到的地方,都加上大括号,以防止出现错误,等熟练后可以简化代码。

1.6 条件运算符

条件运算符也称三目运算符,通过三目可以知道,该运算符需要三个操作数才可以使用,是C语言中唯一的三目运算符。三目运算符构成的表达式称作条件表达式
条件表达式的通用性形式为:exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果exp1为真,exp2计算,计算的结果是整个表达式的结果;如果exp1为假,exp3计算,计算的结果是整个表达式的结果。
示例:
(5 > 3) ? 1 : 2; 整个表达式的值为1
(2 > 3) ? 1 : 2; 整个表达式的值为2
(a > b) ? a : b; 如果a>b,则取较大的值 ---- 该表达式常用于判断两个数的大小
条件表达式是C语言提供的作为表达if-else语句的一种便捷方式。下面将用两种形式举例说明:

例6:输出两个数中的较大的一个数

//if-else形式
#include <stdio.h>

int main()
{
	int a, b;
	scanf("%d%d", &a, &b);

	if (a > b)
		printf("%d", a);
	else
		printf("%d", b);

	return 0;
}
//使用条件运算符
#include <stdio.h>

int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	int max = 0;

	max = a > b ? a : b;
	printf("%d", max);

	return 0;
}

二、关系运算符

关系运算符:一般用于比较两个值两个表达式的值的运算符,通过这句话也可以得知,关系运算符是双目运算符,需要两个操作数。

在数学或者其他学科中,我们常用一些>、<等这些符号来比较大小等表达,同样在C语言中,我们也一样是可以使用这些符号来表达一些比较关系,并且由这些关系运算符所构成的用于比较的表达式,称为“关系表达式”;主要使用的运算符主要以下6个:

  • < 小于运算符
  • > 大于运算符
  • <= 小于等于运算符
  • >= 大于等于运算符
  • == 相等运算符
  • != 不相等运算符

特别注意:相等运算符 == 和赋值运算符 = 是两个不一样的运算符,不要混淆。
小技巧:通常使用相等运算符的时候,我们把变量放在运算符的右侧,常量或者不变的量放在左侧,类似if(3 == n),这样哪怕即使将相等运算符写成了赋值运算符,编译器也会产生报错信息。

关系表达式通常返回的是0或者1,因为我们进行一个比较之后一定可以得出一个比较的结果,比如20 > 12可以得知这是正确的,则这个关系表达式的结果返回的为,或者说返回的为1。在C语言中,表达式得出的结果非假即真,0表示假,所有非零的值表示真,不仅仅是1,即使一个表达式最终的结果为负数,只要值不为0,就表示为真。
由上可知,关系表达式常用于ifwhile结构,用于判断真假。

另外,需要注意避免的一个惯性思维导致初学者常犯的错误:多个关系运算符连用
如果我们想表达a小于b,同时b小于c,在数学中常常这样写:a < b < c
这样的表达式在C语言中不会出现语法错误,但是会产生语义错误
在C语言中,因为关系运算符是从左往右计算,所以电脑所理解的执行顺序为:(a < b) < c,这样不管a是否小于b(a < b)这个表达式的结果一定返回01,然后再用返回的01c进行比较,这样通常得不到想要的结果。如果想要判断变量b是否在ac之间,正确的写法应为:a < b && b < c

例7:输入一个年龄,如果年龄在18岁~36岁之间,我们输出青年。

//错误写法
#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if(18 <= age <= 36)
	{
		printf("青年\n");
	}
	return 0;
}

当我们不管输入的年龄为多少,程序总是输出青年。

//正确写法
#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if(age >= 18 && age <= 36)
	{
		printf("青年\n");
	}
	return 0;
}

以上就是关于关系运算符,我们需要掌握的,剩下的只需要按照字面意思理解使用即可,没有什么特别需要注意的。

三、逻辑运算符

3.1 逻辑运算符: 在上一部分的例7中,我们已经使用过了&&运算符,表示并且的意思;接下来我们将介绍在if语句while语句中常使用的三种逻辑运算符,这些运算符通常把多个关系表达式组合起来表示为更大关系的表达式。以下三种逻辑运算符:

  • && 逻辑与运算符
  • || 逻辑或运算符
  • 逻辑非运算符

假设exp1和exp2是两个简单的表达式(如car > rat 或 debt == 1000),那么:

  • 当且仅当exp1exp2都为真时,exp1 && exp2才为真;
  • 如果exp1exp2为真,则exp1 || exp2为真;
  • 如果exp1为假,则!exp1为真;如果exp1为真,则!exp1为假。

3.2 优先级: !运算符的优先级很高,比乘法运算符还高,与递增运算符的优先级相同,只比圆括号的优先级低,所以!&&||都高,&&的优先级比||的优先级高。
  在程序员的编写习惯中,通常会用圆括号()把必要的部分给包含起来,防止因为优先级的高低而出现程序运行顺序的步骤。例如表达式:a > b && b > c || b > d相当于 ((a > b) && ( b > c)) || (b > d)

3.3 求值顺序: 在逻辑运算符中初学者经常会出现的一个问题,就是对于求值顺序会出现错误;逻辑表达式的求值顺序是从左往右。但是会出现一个短路运算的问题。例:

  • 6>2 && 3==3 运算符为&&,同时为真时整个表达式才为真;该表达式前面为真,后面为真,则为真
  • 6<2 && 3==3 运算符为&&,同时为真时整个表达式才为真;该表达式前面为假,不符合&&为真的条件,一发现有使整个表达式为假的因素,立即停止求值,则不管后面的表达式为真为假,整个表达式都为假,并且后面的表达式也不再进行计算。例:6<2 && a = 3,如上所说,前面表达式为假,立即停止计算,则a是不会被赋值为3的。
  • 6<2 || 4>3 运算符为||,只要有一个表达式为真则为真;该表达式前面为假,再继续看后面的表达式,后面的表达式为真,则该整体的表达式为真。对于||运算符来说,如果第一个表达式就已经为真了,那么整体的表达式一定为真,后面的表达式也是不需要再继续判断真假以及运算或其他的操作。例:6>2 || a = 3,前面的已经为真,那么后面的a则不再进行赋值,是不会被赋值为3的。

例8:闰年的判断,输入一个年份year,判断year是否是闰年

#include <stdio.h>
int main()
{
	int year = 0;
	scanf("%d", &year);
	if (year%4 == 0 && year%100 != 0)
	{
		printf("%d是闰年\n", year);
	}
	else if (year%400 == 0)
	{
		printf("%d是闰年", year);
	}
	
	return 0;
}

四、跳转语句:break和continue

1.1 break

1.2 continue

五、switch语句

1.1 switch和case

1.2 switch语句和if-else语句

六、三大循环控制语句

1.1 for循环

1.2 while循环

1.3 do-while循环

七、goto语句


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值