C语言零基础学习笔记7——分支和循环(一)

本节大纲


一、if 语句

二、关系操作符

        C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构。C语言是能够实现这三种结构的,其实我们如果仔细分析,我们日常所见的事情都可以拆分为这三种结构或者这三种结构的组合。

        我们可以使用 if 、 switch 实现分支结构(选择语句),使用 for 、 while 、 do while 实现循环结构。那么本章中我们就详细的学习这些语句。

 

一、if语句

(一)、if

        if语句的语法形式是这样的:

if (表达式)
	语句

        表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。在C语言中,0为假,非0表示真,也就是表达式的结果如果是0,则语句不执行,表达式的结果如果不是0,则语句执行。

        那么我们来看下面这个例子,实现了“输入一个整数,判断其是否是奇数”的功能,从这段代码我们可以理解if语句的基本语法:

#include <stdio.h>
int main()
{
	int num = 0;
	printf("请输入一个整数:");
	scanf("%d", &num);
	if (num % 2 == 1)
		printf("%d是奇数\n", num);
	return 0;
}

        这段代码的逻辑非常简单,在学习完关系操作符(==)之后,这段代码就没有难度了,下面这张图更加形象的展现了if语句的执行流程以及我们这段举例代码的运行逻辑:

(二)、else

        对于“输入一个整数,判断其是否是奇数”这个命题,往往要求在判断出不是奇数的同时,可以输出这个数为偶数,那么此时我们就需要使用if……else……语句了。

        其语法形式如下:

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

        那么我们就可以对(一)中的示例进行改进,实现“输入一个整数,判断其是否是奇数,如果是奇数打印奇数,否则打印偶数”的功能了:

#include <stdio.h>
int main()
{
	int num = 0;
	printf("请输入一个整数:");
	scanf("%d", &num);
	if (num % 2 == 1)
		printf("%d是奇数\n", num);
	else
		printf("%d是偶数\n", num);
	return 0;
}

        理解上面的代码之后,我们就可以进行类似问题的练习了,比如我们要实现“输入一个年龄,>= 18岁就输出:成年,否则就输出:未成年”,实现这个问题我们已经可以自己进行编程,代码如下:

#include <stdio.h>
int main()
{
	int age = 0;
	printf("请输入一个年龄:");
	scanf("%d", &age);
	if (age >= 18)
		printf("%d岁已成年", age);
	else
		printf("%d岁未成年", age);
	return 0;
}
(三)、分支中包含多条语句

        C语言默认在if和else语句中只控制一条语句,比如说下面的代码,我们无论输入的值大于等于18还是小于18,printf(“可以谈恋爱了\n”); 这句话都会被执行,也就是“可以谈恋爱了”都会打印在屏幕上:

#include <stdio.h>
int main()
{
	int age = 0;
	printf("请输入一个年龄:");
	scanf("%d", &age);
	if (age >= 18)
		printf("%d岁已成年", age);
		printf("可以谈恋爱了\n");
	return 0;
}

        这是因为 if 语句只能控制一条语句,就是 printf("%d岁已成年", age); ,if语句为真,则打印, if语句为假,则不打印,对于 printf("可以谈恋爱了\n"); 是独立存在的,不管if语句的条件的真假,都会被执行。那如果我们要if语句同时控制2条语句,那我们就要使用 {} 将代码括起来,当然,else 后也可以跟上大括号。这个大括号就称为程序块,也可以称为复合语句。

        比如下面这段代码,就实现了if语句和else语句后面分别加入了一个复合语句,我们可以从这段代码直观的观察到程序块的作用:

int main()
{
	int age = 0;
	printf("请输入一个年龄:");
	scanf("%d", &age);
	if (age >= 18)		//使用{}控制多条语句
	{
		printf("%d岁已成年\n", age);
		printf("可以谈恋爱了\n");
	}
	else
	{
		printf("%d岁未成年\n", age);
		printf("不可以早恋哦\n");
	}	
	return 0;
}
(四)、嵌套if

        在 if else 语句中, else 可以与另一个 if 语句连用,构成多重判断。比如说下面这段代码,实现了“输入一个整数,判断输入的整数是0,还是正数或者负数。”的功能:

#include <stdio.h>
int main()
{
	int num = 0;
	printf("请输入一个整数");
	scanf("%d", &num);
	if (num == 0)
		printf("您输入的数字是0\n");
	else if (num > 0)
		printf("您输入的数字是一个正数\n");
	else
		printf("您输入的数字是一个负数\n");
	return 0;
}

        在上面这段代码中,第一个else子句后面的if……else……语句,就构成了嵌套的if语句,当然这种语句也可以使用复合语句的形式改写,我们再举一个例子,实现“输入一个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:您输入了一个负数”,代码如下:

#include <stdio.h>
int main()
{
	int num = 0;
	printf("请输入一个整数:");
	scanf("%d", &num);
	if (num > 0)
	{
		if (num % 2 == 0)
			printf("您输入了一个正数,这个正数是偶数\n");
		else
			printf("您输入了一个正数,这个正数是奇数\n");
	}
	else
		printf("您输入了一个负数\n");
	return 0;
}

        上面这两个示例就展示了嵌套if语句的语法,就可以完成更多更加复杂的逻辑判断,下面我们进行一个练习,实现:“输入一个人的年龄,如果年龄<18岁,打印"少年";如果年龄在18岁值至44岁打印"青年";如果年龄在45岁至59岁打印"中老年" ;如果年龄在60岁至89岁打印"老年" ;如果90岁以上打印"老寿星" ”,大家可以自行编程,下面我给出两种解决办法(一种使用复合语句一种不使用):

//第一种:使用复合语句很好理解
#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
		{
		printf("少年\n");
		}
	else
		{
		if (age <= 44)
			{
			printf("青年\n");
			}
		else
			{
			if (age <= 59)
				{
				printf("中老年\n");
				}
			else
				{
				if (age <= 90)
					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 <= 44)
		printf("青年\n");
	else if (age <= 59)
		printf("中老年\n");
	else if (age <= 90)
		printf("老年\n");
	else
		printf("老寿星\n");
	return 0;
}
(五)、悬空else问题

        如果有多个 if 和 else ,可以记住这样一条规则, 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 是 0,不等于 1 ,那就执行 else 子句,打印 haha 。但是当你去运行代码,输出的结果是:空白。

        这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样一条规则, else 总是跟最接近的 if 匹配。

        上面的代码排版,让 else 和第一个 if 语句对齐,让我们以为 else 是和第一个if匹配的,当 if 语句不成立的时候,自然想到的就是执行 else 子句,打印 haha ,但实际上 else 是和第二个 if 进行匹配的,这样后边的 if...else 语句是嵌套在第一个 if 语句中的,如果第一个 if 语句就不成立,嵌套 if 和 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;
}

        如果我们希望else确实和第一个if匹配,打印出“haha”,也是可以实现的,我可以将代码修改如下,这样else就无法透过大括号和最近的if语句匹配,也就是说我们通过大括号强行将第二个if语句和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;
}

        所以我们应该在编程的时候带上适当的大括号,这样代码的逻辑就会变得非常清晰,所以大家以后在写代码的时候要注意大括号的使用,让代码的可读性变得跟高。


二、关系操作符

        C 语言用于比较的表达式,称为 “关系表达式”(relational expression),里面使用的运算符就称为“关系运算符”(relational operator),主要有下面6个。

· > 大于运算符

· < 小于运算符

· >= 大于等于运算符

· <= 小于等于运算符

· == 相等运算符

· != 不相等运算符

        关系表达式通常返回 0 或 1 ,表示真假。

        C 语言中, 0 表示假,所有非零值表示真。比如, 20 > 12 返回 1 , 12 > 20 返回 0 。

        关系表达式常用于 if 或 while 结构。

        注意:相等运算符 == 与赋值运算符 = 是两个不一样的运算符,不要混淆。有时候,可能会不⼩⼼写出下面的代码,它可以运行,但很容易出现意料之外的结果。

if (x = 2)
……

        上面示例中,原意是 x == 3 ,但是不小心写成 x = 3 。这个式子表示对变量 x 赋值 3 ,它的返回值为 3 ,所以 if 判断总是为真。为了防止出现这种错误,有的程序员喜欢将变量写在等号的右边。这样即使不小心写错了,编译器就会直接报错,方便程序员修改这个问题。

        还有另外一个需要避免的错误就是多个关系运算符号不宜连用,如下面这段代码:

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

        上面代码中出现了 18 <= age <= 36 这样的内容,关系运算符的根本逻辑是从左到右计算,所以这个式子实际上是执行了:(18 <= age )<= 36 ,18 <= age 会返回 0 或 1 。所以最终是 0 或 1 进行比较,所以对于这段代码,无论我们输入的数字是多少,都会打印“青年”。

        如果我们想要正常的比较变量 age 的值是否在18和36之间的时候,我们就要引入 && 符号(表示并且),使用这样的写法:

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

        这样这段代码的逻辑就完全没有问题了。

        其余关于关系操作符的内容就按照字面意思理解使用就可以了。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值