上一篇文章: C语言学习笔记Day1——持续更新中… …
五. 分支语句
1. 什么是语句
在C语言中,语句是程序执行的单元,程序的功能由程序中的每一条语句实现和完成,每条语句都以分号’;'结束。
2. 语句的执行顺序
在一个函数(函数的解释未更新)中,所有的语句都是从上往下执行
3. if判断语句
if判断语句属于分支语句,它有三种形式,分别是:单if判断语句、if…else…判断语句(有时候我更喜欢叫它分支判断语句)、if…else if…else判断语句(正如之前的那样,有时我喜欢称它多分支判断语句)。
3.1 单if判断语句
3.1.1 语法结构
if (条件表达式)
{
语句块;
}
3.1.2 示例
// 示例一
#include <stdio.h>
int main()
{
int a = 1;
if (a > 0) // 因为a = 1, 所以a > 0是对的, 故而它会进入大括号执行printf()语句
{
printf("a比0大!");
}
return 0;
}
// 示例二
#include <stdio.h>
int main()
{
int a = 1;
// 因为a = 1, 所以a < 0是错的,
// 故而它不会进入大括号, 当然也不会执行printf()语句
if (a < 0)
{
printf("a比0大!");
}
return 0;
}
3.2 if…else…判断语句
3.2.1 语法结构
// if语句和else语句后面的语句块中只会有一个语句块被执行
if (条件表达式)
{
语句块;
}
else
{
语句块;
}
3.2.2 示例
// 示例一
#include <stdio.h>
int main()
{
int a = 1;
// 因为a = 1, 所以a > 0是对的,
// 故而它会进入if下面紧跟着的大括号中并执行printf()语句
// 后面的else语句中的printf()语句不会执行
if (a > 0)
{
printf("a比0大!");
}
else
{
printf("a比0小!");
}
return 0;
}
// 示例二
#include <stdio.h>
int main()
{
int a = 1;
// 因为a = 1, 所以a < 0是错的,
// 故而它不会进入if下面紧跟着的大括号, 也就不会执行printf()语句
// 但是if语句不执行, 后面的else语句中的printf()语句就会执行了
// 这是因为在这个世界上只有"是、否"两种, 不执行if就会执行else
if (a < 0)
{
printf("a比0大!");
}
else
{
printf("a比0小!");
}
return 0;
}
// 示例三
#include <stdio.h>
int main()
{
int a = 1;
// 因为a = 1, 所以a < 0是错的, a > -5是对的,
// 但是'&&'表示两者都, 也就是需要a < 0和a > -5必须全部是对的才可以,
// 故而它不会进入if下面紧跟着的大括号, 也就不会执行printf()语句
// 但是if语句不执行, 后面的else语句中的printf()语句就会执行了
// 这是因为在这个世界上只有"是、否"两种, 不执行if就会执行else
if (a < 0 && a > -5)
{
printf("a比0大!");
}
else
{
printf("a比0小!");
}
return 0;
}
Tips: 除了(与)’&&‘以外还有(或)’||’, 具体可以看运算符那一节哦
3.3 if…else if…else…判断语句
3.3.1 语法结构
// 在这种语句中也至少会有一个语句块被执行
if (条件表达式)
{
语句块;
}
else if (条件表达式) // 值得注意的是else if后面也会有条件表达式
{
语句块;
}
else if (条件表达式)
{
语句块;
}
// else if的数量取决于目前判断的事件有多少种情况,
// 一般而言如果事件有4种情况,
// 那么就只需要4 - 2 = 2个else if语句
...
else
{
语句块;
}
3.3.2 示例
#include <stdio.h>
int main()
{
int a = 10;
// 可以看到对于一个数字而言, 它与0做比较只会出现三种情况
// 情况一: 大于0
// 情况二: 小于0
// 情况三: 等于0
// 由于上面的分析所以可以知道下面三个printf()语句至少会有一个被执行
if (a > 0)
{
printf("a大于10!");
}
else if (a < 0)
{
printf("a小于10!");
}
else
{
printf("a等于10!");
}
return 0;
}
4. switch语句
4.1 什么是switch语句
switch语句与if语句同属于分支语句,这是因为他们两有一个共同的地方——都需要判断满足才会执行特定的语句块。
4.2 语法结构
switch (nNum)
{
// case后面的1是指nNum可能的数值, 且必须为整数类型或者可以转换成整数的类型, 即:
// 可以为int、[unsigned] long [long]、char, 不可以为浮点数、指针等
case 1: // 注意后面有个冒号':'
语句块; // 语句块中有其它语句的话请按其它语句的语法编写
break; // break语句必须得有
case 2:
语句块;
break;
... ...
case 12:
语句块;
break;
default: // 相当于if语句中的else,上面全不满足的时候就会执行default下面的语句块
语句块;
break;
}
4.3 示例
// 输入数字转换成中文月份
#include <stdio.h>
int main()
{
int nNum = 0;
scanf("%d", &nNum); // 输入一个数字并保存至nNum变量中, 此处的'&'表示引用
if (nNum < 1 || nNum > 12) // 月份只会在1——12范围中, 所以判断一下, 确保输入是正确的
printf("您的输入不正确! 请输入1 —— 12内的数值!");
switch (nNum)
{
// case后面的1是指nNum可能的数值, 且必须为整数类型或者可以转换成整数的类型, 即:
// 可以为int、[unsigned] long [long]、char, 不可以为浮点数、指针等
case 1:
printf("一月");
break;
case 2:
printf("二月");
break;
case 3:
printf("三月");
break;
case 4:
printf("四月");
break;
case 5:
printf("五月");
break;
case 6:
printf("六月");
break;
case 7:
printf("七月");
break;
case 8:
printf("八月");
break;
case 9:
printf("九月");
break;
case 10:
printf("十月");
break;
case 11:
printf("十一月");
break;
case 12:
printf("十二月");
break;
default: // 除了上面用的if判断以外, 还可以在default中写入判断
/*printf("您的输入不正确! 请输入1 —— 12内的数值!");*/
break;
}
return 0;
}
六. 循环语句
1. for循环语句
1.1 语法结构
// 前两个表达式后面都有分号
// 表达式1一般是变量初始值
// 表达式2一般是变量结束的条件
// 表达式3一般是变量的变化规则, 例如: 自增(++)、自减(--) ... ...
for (表达式1; 表达式2; 表达式3)
{
循环体;
}
1.2 示例
// 示例1: 打印 1——20
#include <stdio.h>
int main()
{
// 一般打印1 —— 20在没学过循环之前都是用20次printf()函数进行打印
// 这么做无疑会写至少20行代码, 但是循环只需要短短几行代码即可实现, 如下:
int i;
for (i = 1; i <= 20; i++) // 因为要包含20, 所以需要用小于等于(<=)
{
printf("%d ", i);
}
printf("\n");
// 针对这种简单的循环, 其实还可以将变量i的定义与赋值都放在表达式1中, 如下:
for (int i = 1; i <= 20; i++)
{
printf("%d ", i);
}
return 0;
}
// 示例2: 打印 1——20中的所有偶数
#include <stdio.h>
int main()
{
// 示例一中已经可以打印1——20了, 那么如何挑选其中的偶数呢?
// 这里为了结合练习if语句, 我们使用运算符'%'
// 这是取余运算符, 一个数为偶数的关键在于这个数除以2是否余1,
// 如果余1, 那么此数为奇数, 反之为偶数, 实现方式如下
for (int i = 1; i <= 20; i++)
{
if (i % 2 != 1) // 这里的条件表达式可以换成其他的哦~
{
printf("%d ", i);
}
}
return 0;
// Tips: 此题还有其它做法哦~
}
2. while循环语句
2.1 语法结构
// 若条件表达式成立, 则循环体将会一直执行
// 建议仔细检查, 小心无限循环
while (条件表达式)
{
循环体;
}
2.2 示例
// 示例1: 计算1 + 2 + 3 + ... + 99 + 100的值
#include <stdio.h>
int main()
{
// 此题如果不用循环其实是蛮难搞的
// 此题有一个很明显的特点, 它有一个起始值和一个结束值,
// 分别是1和100, 所以便可以此构建while循环了
int nSum = 0; // 定义变量nSum保存和
int i = 1; // 定义变量i, 给它附上题目中的起始值
while (i <= 100) // 让变量i最大不能超过题目中的结束值
{
nSum += i; // 此语句相当于nSum = nSum + i;
i++; // 变量i自增, 模拟题目中每个加数的变化
}
printf("%d", nSum);
return 0;
}
// 示例2: 找出100——999以内的水仙花数
// Notes: 水仙花数是指一种三位数,其各个数之立方和等于该数。
// 例如: 153 = 1^3 + 5^3 + 3^3
#include <stdio.h>
#include <math.h> // 因为有次方, 这里使用math.h头文件中的pow()函数
int main()
{
// 此代码不做解释, 请自行分析
int i = 100;
while (i < 1000)
{
// 先取出这个三位数的个十百位
int nUnit = (i % 100) % 10; // 个位
int nTen = (i % 100) / 10; // 十位
int nHundred = i / 100; // 百位
if ((int)pow(nUnit, 3) + (int)pow(nTen, 3) + (int)pow(nHundred, 3) == i)
printf("%d ", i);
i++;
}
return 0;
}
3. do…while循环
3.1 语法结构
do
{
循环体;
}while(条件表达式); // 值得注意的是最后有个分号哦~
3.2 示例
// 示例1: 找出100——999以内的水仙花数
// Notes: 水仙花数是指一种三位数,其各个数之立方和等于该数。
// 例如: 153 = 1^3 + 5^3 + 3^3
#include <stdio.h>
#include <math.h> // 因为有次方, 这里使用math.h头文件中的pow()函数
int main()
{
// 此代码不做解释, 请自行分析
int i = 100;
do
{
// 先取出这个三位数的个十百位
int nUnit = (i % 100) % 10; // 个位
int nTen = (i % 100) / 10; // 十位
int nHundred = i / 100; // 百位
if ((int)pow(nUnit, 3) + (int)pow(nTen, 3) + (int)pow(nHundred, 3) == i)
printf("%d ", i);
i++;
}while(i < 1000);
return 0;
}
3.3 while循环与do…while循环的区别
// 运行下面的代码, 你会发现while循环中的循环体语句不会被执行,
// 而do...while循环中的循环语句被执行了
// 这是由于while属于先判断再执行, do...while属于先执行后判断
// 建议好好揣摩, 同时也建议尽量不用do...while循环
#include <stdio.h>
int main()
{
int i = 1;
while (i == 0)
{
printf("while循环执行了!");
}
do
{
printf("do...while循环执行了!");
} while (i == 0);
return 0;
}
七. 其它语句
语句有很多,比如return也是一个语句,它被称为返回语句,这里需要了解的是goto语句。
1. 语法结构
goto 标识符;
标识符:
代码块;
2. 示例
// 成都有一个'时空伴随者'很火爆, 指本人的电话号码与确诊号码在同一时空网格
// (范围是800M*800M)共同停留超过10分钟,且最近14天任一方号码累计停留时
// 长超过30小时以上,则查出的号码为时空伴随号码。
// 这里我们用goto语句实现它, 当然别妄想现在就完全实现,目前只是实现它的思想,
// 其实就是如果范围内有一个是红码了,那么区域内全变红码,
// 所以这里就是说只要找到一个就不需要继续往下找了, 直接打印红码就行了。
#include <stdio.h>
int main()
{
// 模拟母体红码: 这里使用一串数字, 一个数字对应一个人
// 他们满足时空伴随者的条件, 且20号为红码
int i = 0
while (1)
{
if (i == 20)
goto Spacetime; // Spacetime: 标识符, 用户自定义
i++;
}
Spacetime:
printf("警告!全改成红码~");
return 0;
}
3. 尝试
如果上面的示例中没有使用goto语句会发生什么呢?
4. 建议
goto语句能不用就不要用~
吃饭睡觉咯,头发要紧~