[简明C语言]分支和循环P_1:分支 - if语句
前言
第二章:分支和循环
C语言是结构化的程序设计语言!
- 顺序结构
- 选择结构
- 循环结构
在本章中介绍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,走上人生巅峰。
如果不想学习,将来就会失业,回家卖红薯。
这就是选择!
但是!
有没有一种可能,人生不止两种选择呢?
这就是多选择!
那么多选择如何实现呢?
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;
}
报错!
左边的常量5是无法被改变的,程序无法运行!!
所以,当两个整型变量进行比较的时候,最好把常量放在左边。
可以看出代码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语句,对分支语句有一个更细致的了解。