3. 分支、循环和数组
分支
if - else
写一个代码判断输入的数是正数、负数还是零,当你到手这个需求的时候,你会发现,按照目前为止学过的知识搞不出来,必须要有表达类似 如果…,那么就…,否则就…
这样的语句才行
换成英文来说就是 if…then…else…
,而 C 语言就有差不多这样的表达。在执行顺序看上去,就像是代码在此处进入了岔路口,必须要根据不同的条件选择一条分支来执行,因此,判断语句又被称为分支语句
例如,对于这个需求,我们可以这样写:
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
if (n > 0) {
printf("正数\n");
} else if (n < 0) {
printf("负数\n");
} else {
printf("零\n");
}
return 0;
}
提示
因为 if
语句和一般的函数调用不太相同,所以我更喜欢在之后加一个空格,这样看上去更美观一些,之后的 for
等语句同理
注意
if
语句的子代码块不是必须用 {}
包裹的,但是为了代码的可读性考虑,建议还是加上 {}
,这样代码的可读性会大大提高,也是一种非常良好的代码编写规范,即使这会让代码看上去更长。
接下来我们来详细剖析一下 if
语句的用法
最基础的 if
语句非常简单,就长这样:
if (condition) {
// do something
}
其中,condition
是一个条件表达式,它的最终结果可以是任意整数,当这个整数不为零,则条件成立,执行内部的操作,否则,跳过内部的操作,继续执行后面的代码
提示
再提醒一次,C 语言中的 if
的判断条件非零即真!
如果条件不成立,你也需要执行一些操作,那么你可以使用 else
语句,它表示“否则”的意思,例如:
if (condition) {
// do something
} else {
// do something else
}
如果需要判断多个条件,可以连续使用 if else
语句,组成 combo,例如:
if (condition1) {
// do something
} else if (condition2) {
// do something else
} else {
// do something else
}
注意
注意,当一个 else
被编写出来后,它会找到离自己最近的 if
进行匹配,在编写逻辑判断语句的时候,最好写完之后重看一遍,确定自己的逻辑是正确的!
逻辑运算符
判断必然也得搭配逻辑运算符食用,C 语言中有以下几种逻辑运算符:
&&
:逻辑与,表示“且”的意思,只有当两个条件都成立时,整个表达式才成立||
:逻辑或,表示“或”的意思,只要有一个条件成立,整个表达式就成立!
:逻辑非,表示“非”的意思,将一个条件取反==
:等于,表示“等于”的意思,用于比较两个值是否相等!=
:不等于,表示“不等于”的意思,用于比较两个值是否不相等>
:大于,表示“大于”的意思,用于比较两个值的大小关系<
:小于,表示“小于”的意思,用于比较两个值的大小关系>=
:大于等于,表示“大于等于”的意思,用于比较两个值的大小关系<=
:小于等于,表示“小于等于”的意思,用于比较两个值的大小关系
注意
赋值符号 =
和等于符号 ==
是不同的,前者表示赋值,后者表示等于,不要搞混了!
比如说,判断闰年就是经典的例子,闰年满足以下条件:
- 能被 4 整除但不能被 100 整除
- 或者能被 400 整除
那么我们可以这样写:
int main() {
int year;
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
printf("是闰年\n");
} else {
printf("不是闰年\n");
}
return 0;
}
三目运算符
三目运算符是 C 语言中的一种特殊运算符,它的形式如下:
condition ? value1 : value2
它的作用是,如果 condition
为真,则返回 value1
,否则返回 value2
例如,我们可以用三目运算符来写一个求绝对值的操作:
int main() {
int n = -1;
int abs_n = n > 0 ? n : -n;
}
同理,三目运算符也能用来选择执行简单的操作,例如:
int main() {
int n = 1;
n > 0 ? printf("正数\n") : printf("负数\n");
}
提示
三目运算符可以嵌套使用,但是嵌套过多会导致代码可读性下降,因此不建议嵌套使用三目运算符
switch - case
switch
语句是一种特殊的分支语句,它的形式如下:
switch (expression) {
case value1:
// do something
break;
case value2:
// do something else
break;
default:
// do something else
}
它的作用是,根据 expression
的值,选择执行对应的 case
语句,如果 expression
的值与任何一个 case
的值都不匹配,则执行 default
语句
例如,我们可以用 switch
语句来写一个判断输入的数是正数、负数还是零的操作:
int main() {
int n;
scanf("%d", &n);
switch (n > 0) {
case 1:
printf("正数\n");
break;
case 0:
printf("零\n");
break;
default:
printf("负数\n");
}
return 0;
}
提示
switch
语句的 case
语句可以不写 break
,这样会继续执行下一个 case
语句,直到遇到 break
或者 switch
语句结束
循环
—— 如何输出 1 到 100?
—— 我一个一个输出啊
循环语句是 C 语言中的一种特殊语句,它的作用是重复执行一段代码,直到满足某个条件为止
而 for
循环是最常见的一种,实际上,在 C 语言中它改变形式后可以替代所有形式的循环,包括之后说到的 while
和 do while
循环
for
循环的形式如下:
for (initialization; condition; update) {
// do something
}
提示
你可以使用 continue
来直接进入下一次循环过程
你也可以使用 break
来直接跳出循环
它的作用是,先执行 initialization
,然后判断 condition
是否成立,如果成立,则执行 do something
,然后执行 update
,再判断 condition
是否成立,如果成立,则继续执行 do something
,直到 condition
不成立为止
例如,我们可以用 for
循环来输出 1 到 100:
int main() {
for (int i = 1; i <= 100; i++) {
printf("%d\n", i);
}
return 0;
}
提示
for
循环的 initialization
、condition
和 update
可以省略,但是不能省略 condition
,否则会导致死循环
死循环指的是无法终止的循环,会导致程序卡死
while
while
循环的形式如下:
while (condition) {
// do something
}
它的作用是,先判断 condition
是否成立,如果成立,则一直执行 do something
,直到 condition
不成立为止
例如,我们可以用 while
循环来输出 1 到 100:
int main() {
int i = 1;
while (i <= 100) {
printf("%d\n", i);
i++;
}
return 0;
}
提示
for
循环可以用来替代 while
循环,例如上面的代码可以写成:
int main() {
int i = 1;
for (; i <= 100; ) {
printf("%d\n", i);
i++;
}
return 0;
}
do while
do while
循环的形式如下:
do {
// do something
} while (condition);
它和 while
循环的区别是,do while
循环会先执行一次 do something
,然后再判断 condition
是否成立,如果成立,则继续执行 do something
,直到 condition
不成立为止
例如,我们可以用 do while
循环来输出 1 到 100:
int main() {
int i = 1;
do {
printf("%d\n", i);
i++;
} while (i <= 100);
return 0;
}
提示
do while
循环也可以用 for
循环来替代,例如上面的代码可以写成:
int main() {
int i = 1;
for (; ; ) {
printf("%d\n", i);
i++;
if (i > 100) {
break;
}
}
return 0;
}
但是因为 do while
循环的特性,所以它更适合用在循环次数不确定的情况下,这种情况使用 for
循环来替代会显著降低代码可读性
数组
数组是一种特殊的变量,它可以存储多个相同类型的值,例如:
int a[10];
这创建了一个大小为 10 的整数数组,它就像一个抽屉,每个抽屉里可以放一个整数,你可以通过下标来访问数组中的元素,例如:
a[0] = 1;
a[1] = 2;
a[2] = 3;
这把数组中的第一个元素赋值为 1,第二个元素赋值为 2,第三个元素赋值为 3
提示
数组的下标从 0 开始,所以数组中的第一个元素的下标是 0,第二个元素的下标是 1,以此类推
注意
由于下标从 0 开始,所以上面的数组的最大下标实际上是 9
!而不是 10
!
你可以通过循环来遍历数组中的所有元素,例如:
for (int i = 0; i < 10; i++) {
printf("%d\n", a[i]);
}
提示
数组的大小是固定的,不能动态改变,如果你需要存储更多的元素,你需要创建一个更大的数组
goto
goto
是 C 语言中的一种特殊语句,它的形式如下:
goto label;
它的作用是,直接跳转到 label
标签的位置,然后继续执行后面的代码
例如,我们可以用 goto
来写一个简单的循环:
int main() {
int i = 0;
loop:
printf("%d\n", i);
i++;
if (i < 10) {
goto loop;
}
return 0;
}
注意
goto
语句可以用来实现循环,但是因为它的跳转特性,所以它可能会导致代码的混乱、可读性下降,因此极度不建议使用 goto
语句
最好仅在需要快速连续跳出多层循环时使用 goto
语句
试一试!
DotOJ 补完计划 - 南哪 2022-2-if-for-array
DotOJ 补完计划 - 南哪 2022-3-for-a-while
DotOJ 补完计划 - 南哪 2022-4-loop