[简明C语言]分支和循环P_1:分支 - if语句


前言

第二章:分支和循环
C语言是结构化的程序设计语言!

  1. 顺序结构
  2. 选择结构
  3. 循环结构

在本章中介绍C语言中的分支语句和循环语句。

本章重点:
 
分支语句

  • if
  • switch

循环语句

  • while
  • for
  • do while

goto语句


1. 什么是语句?

C语言中由一个分号;隔开的就是一条语句。比如:

#include <stdio.h>;

int main()
{
	printf("Hello,World!");//语句
	1 + 2;//语句
	;//空语句
	return 0;//语句
}

2. 分支语句(选择结构)

C语言概述第三部分简单介绍过选择结构:

人生有很多路可以去选择,但只有一条路不能选择,那就是放弃的路;还有一条路不能拒绝,那就是成长的路。
 
如果好好学习,将来拿到一个好offer,走上人生巅峰。
如果不想学习,将来就会失业,回家卖红薯。
这就是选择!

好好学习
不想学习
上学
好offer
卖红薯

但是!
有没有一种可能,人生不止两种选择呢?

好好学习
家里有99套房子
不想学习
上学
好offer
呵呵
卖红薯

这就是多选择!
那么多选择如何实现呢?


if语句

用一段伪代码来描述模块结构图:

语法结构:
类型一:单分支结构
if(表达式)
	语句;
//表达式为真(非0),语句执行;
//表达式为假(0),语句不执行。

类型二:双分支结构
if(表达式)
	语句1;
else
	语句2//表达式为真,执行语句1;
//表达式为假,执行语句2。

类型三:多分支结构
//多分支
if(表达式1)
	语句1;
else if(表达式2)
	语句2;
else
	语句3//表达式1为真,执行语句1;
//表达式1为假,判断表达式2;
//表达式2为真,执行语句2;
//表达式2为假,执行语句3.

单分支结构

看个例子🌰:

//类型一:单分支结构
#include <stdio.h>

int main()
{
	int age = 19;
	if (age >= 18)
		printf("成年\n");

	return 0;
}

运行结果:
运行结果

双分支结构

再看个例子🌰:

类型二:双分支结构
#include <stdio.h>

int main()
{
	int age = 10;
	if (age >= 18)
		printf("成年\n");
	else
		printf("未成年\n");

	return 0;
}

运行结果:
运行结果
 
那么如果想在后面多加一句话呢?
看看这么写可以正确打印出来吗:

#include <stdio.h>

int main()
{
	int age = 20;
	if (age >= 18)
		printf("成年\n");
	else
		printf("未成年\n");
		printf("不能谈恋爱\n");//添加一句话
	return 0;
}

那么,
运行结果是:
运行结果
这合理吗?

不合理。

这是因为if或者else默认只能控制一句话。

所以在代码中新添加的代码是一行独立的代码

如果想让if或else控制多条语句,就需要用{}将多条语句放在一起:

#include <stdio.h>

int main()
{
	int age = 20;
	if (age >= 18)
	{
		printf("成年\n");
	}
	else
	{
		printf("未成年\n");
		printf("不能谈恋爱\n");
	}
	return 0;
}

运行结果:
运行结果
运行达到了预期结果!

这里的一对大括号{}括起来的部分叫就做代码块

适当的使用{}可以使代码的逻辑更加清楚。
要养成使用{}的好习惯!

代码块

代码块:用一对{}括起来的部分

(1)代码块中声明的变量,只能在代码块中使用。因为代码块结束后,代码块中声明变量所占用的内存空间就会被回收
(2)代码块中可以定义和代码块外同名的变量。在代码块中使用这个变量名时使用的都是代码块中声明的变量(相当于代码块中的变量暂时遮盖了外面的变量)

多分支结构

学习了单分支结构和双分支结构,那么是不是觉得多分支结构应该这么写?

//类型三:多分支结构
#include <stdio.h>

int main()
{
	int age = 666;
	if (age < 18)
	{
		printf("少年\n");
	}
	else if (18 <= age < 26)
	{
		printf("青年\n");
	}
	else
	{
		printf("老人\n");
	}
	return 0;
}

那么结果是!
运行结果
怎么还是青年呢?

这种写法在逻辑上是错误的!
这个语句是怎么执行的呢?

else if (18 <= age < 26);

首先执行18 <= age,在age=666时,表达式成立,
所以18 <= age的结果为1(真);
 
然后!
语句会使用【18 <= age】的结果【1】和26进行判断 !
即:1 < 26,判断的结果也为
所以就会打印出青年
由此看出,这是一种逻辑上的错误。

正确的写法为:

#include <stdio.h>

int main()
{
	int age = 666;
	if (age < 18)
	{
		printf("少年\n");
	}
	else if (age >= 18 && age < 26)
	{
		printf("青年\n");
	}
	else if (age >= 26 && age < 40)
	{
		printf("中年\n");
	}
	else if (age >= 40 && age < 60)
	{
		printf("壮年\n");
	}
	else
	{
		printf("老人\n");
	}
	return 0;
}

再看看运行结果:
运行结果
运行结果就符合预期了。

else也可以不写:

#include <stdio.h>

int main()
{
	int age = 666;
	if (age < 18)
	{
		printf("少年\n");
	}
	else if (age >= 18 && age < 999)
	{
		printf("老人\n");
	}

	return 0;
}

运行结果:
运行结果
不写else也可以正常运行。

if - else匹配的“就近原则”

❓你觉得这段代码的打印出来什么结果:

#include <stdio.h>

int main()
{
	int a =0;
	int b =2;
	if(a == 1)
		if(b == 2)
			printf("111\n");
	else
		printf("666\n");
	return 0;
}

运行结果为:
运行结果
没有结果!

这就是一个else匹配的问题。
在这段代码中:
代码
因为第一个if和else对齐,所以很容易看成第一个if和else匹配,if条件不符合,则输出else,即打印666。

实际上,else与它最上面最近的未配对的if配对,所以else配对的是第二个if

给代码加上{}

#include <stdio.h>

int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	{
		if (b == 2)
		{
			printf("111\n");
		}
		else
		{
			printf("666\n");
		}
	}
	return 0;
}

代码

这样看是不是清晰了很多,因为第一个if语句中a = 0不满足if (a == 1),所以直接运行结束了,并没有给第二个if语句运行的机会。

由此可见,代码的书写方法和风格非常重要。

代码风格

代码的书写方法和风格是非常重要的。
学习代码规范,保证代码的美观可读
推荐书目:《高质量的C/C++编程》

if语句书写形式的对比

👀这里有两段代码:

//代码1
if (condition) {
	return x;
}
return y;

//代码2
if (condition)
{
	return x;
}
else
{
	return y;
}

这两段代码的意思一样吗?

这两段代码表达的意思是一样的!

每次调用函数只能有一个return语句被执行,所以只有一个返回值。
而执行到return语句时,会退出函数,return后面的语句将不再执行!!

但是代码风格不同,代码的表达效果和可读性就有所不同。
可以看出代码2更加美观可读

👀再看两段代码:

//代码3
int num = 1;
if (num == 5)//= 是赋值运算符;== 关系运算符
{
	printf("666\n");
}

//代码4
int num = 1;
if (5 == num)
{
	printf("666\n");
}

对于代码3,如果把关系运算符==错写成了赋值运算符=,程序虽然结果是错误的,但仍然可以运行,就很难发现错误的地方:

#include <stdio.h>

int main()
{
	int num = 1;
	if (num = 5)
	{
		printf("666\n");
	}
	return 0;
}

运行结果:
在这里插入图片描述
可以看到,运行得出的并非预期结果。

但是如果写成代码4的形式:

#include <stdio.h>

int main()
{
	int num = 1;
	if (5 == num)
	{
		printf("666\n");
	}
	return 0;
}

假如!错把关系运算符==错写成了赋值运算符=

#include <stdio.h>

int main()
{
	int num = 1;
	if (5 = num)//写错了!
	{
		printf("666\n");
	}
	return 0;
}

报错!
if
左边的常量5是无法被改变的,程序无法运行!!

所以,当两个整型变量进行比较的时候,最好把常量放在左边
if
可以看出代码4才是好的代码风格。

以上代码2和代码4更好,逻辑更加清晰,不容易出错。


练习

练习一:判断一个数是否为奇数

代码:

#include <stdio.h>

int main()
{
	int num = 15;
	if (1 == num % 2)
		printf("奇数\n");
	else
		printf("偶数\n");

	return 0;
}

练习二:输出1-100之间的奇数

用while写:

#include <stdio.h>

int main()
{
	int i = 0;
	while (i <= 100)
	{
		if (1 == i % 2)
		{
			printf("%d ", i);
		}
		i = i++;
	}
	return 0;
}

用for写:

#include <stdio.h>

int main()
{
	int i = 0;
	for (i = 1; i <= 100; i++)
	{
		if (1 == i % 2)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

一些写法:

小问题:用for语句编写时,把创建变量i放到for语句中:

for (int i = 1; i <= 100; 1++)

这是C++写法,
或者C99标准支持这种写法。
有些编译器不支持C99时不可以这么写。
 
VS2022可以这么写。

直接生成并打印出所有奇数(不用if语句):

int main()
{
	for (int i = 1; i <= 100; i += 2)//从1开始递增2
	{
		printf("%d ", i);
	}
	return 0;
}

总结

本文详细介绍了分支语句中的if语句,对分支语句有一个更细致的了解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

H3T

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

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

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

打赏作者

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

抵扣说明:

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

余额充值