流程控制
C 语言的程序是顺序执行,即先执行前面的语句,再执行后面的语句。开发者如果想要控制程序执行的流程,就必须使用流程控制的语法结构,主要是条件执行和循环执行。
if 语句
if
语句用于条件判断,满足条件时,就执行指定的语句。
if (条件表达式) {
// 条件表达式求值为真(非零)时执行这里的代码块
语句1;
语句2;
// ...
}
双分支if...else
语句
if (条件表达式) {
// 条件为真时执行这里的代码块
语句1;
} else {
// 条件为假时执行这里的代码块
语句2;
}
多分支if...else if...else
语句:
if (条件1) {
// 如果条件1为真,则执行这里
语句1;
} else if (条件2) {
// 如果条件1为假且条件2为真,则执行这里
语句2;
} else if (条件3) {
// 如果前面所有条件都为假且条件3为真,则执行这里
语句3;
}
// 可以有更多的else if分支...
else {
// 所有条件都为假时执行这里的代码块
语句n;
}
如果有多个if
和else
,可以记住这样一条规则,else
总是跟最接近的if匹配。
f (number > 6)
if (number < 12)
printf("The number is more than 6, less than 12.\n");
else
printf("It is wrong number.\n");
上面示例中,else
部分匹配最近的if
(即number
< 12),所以如果number
等于6,就不会执行else
的部分。
建议还是可读性高一点的写法
if (number > 6) {
if (number < 12) {
printf("The number is more than 6, less than 12.\n");
}
} else {
printf("It is wrong number.\n");
}
三元运算符 ?:
C 语言有一个三元表达式?:
,可以用作if...else
的简写形式。
条件表达式 ? 表达式1 : 表达式2;
int x = 10;
int y = 20;
int maxVal = (x > y) ? x : y;
在上面的例子中,(x > y)
是条件表达式。如果 x
大于 y
,则 maxVal
被赋予 x
的值,否则 maxVal
被赋予 y
的值。所以,在这个例子中,由于 x
不大于 y
,因此 maxVal
的最终值将会是 y
的值,也就是 20。
这种语法结构常被用来替代简单的 if-else
结构,尤其在需要快速确定并返回一个值的情况下,它能够使代码更加紧凑。不过要注意的是,对于更复杂的条件判断和多分支逻辑,使用传统的 if-else
结构可能更具可读性和易维护性。
switch 语句
switch 语句是一种特殊形式的 if…else 结构,用于判断条件有多个结果的情况。它把多重的else if改成更易用、可读性更好的形式。
switch (表达式) {
case 常量1:
// 当表达式的值等于常量1时,执行这里的语句块
语句1;
break; // 终止当前case的执行并退出switch结构(如果不break,将顺序执行下一个case)
case 常量2:
// 当表达式的值等于常量2时,执行这里的语句块
语句2;
break;
// 可以有任意数量的case语句
default: // 可选,当表达式的值与所有case都不匹配时执行此代码块
语句n;
}
switch
后面的表达式的结果必须是可以转换为整型的类型。- 每个
case
标签后面跟的是一个或多个常量表达式,它们的值不能相同。 - 当找到与
switch
表达式结果相匹配的case
标签后,将执行对应case
后的语句直到遇到break
关键字或到达switch
结构的末尾。 - 如果没有
break
关键字,程序会执行完当前case后的语句后继续执行下一个case
的语句,这种情况称为"穿透"或"fallthrough"。 default
子句是可选的,但如果存在的话,它总是位于所有case
标签之后,且仅在没有任何case
匹配时执行。
while 语句
while
语句用于循环结构,满足条件时,不断执行循环体。while
循环的基本语法格式如下:
while (条件表达式) {
// 当条件表达式求值为真(非零)时,执行此处的循环体
循环体内的语句1;
循环体内的语句2;
// ...
}
循环开始前,首先会计算括号内的条件表达式,如果其结果为真(非零),则执行循环体内的语句;执行完毕后,再次检查条件表达式,若仍然为真,则继续执行循环体;当条件变为假(零)时,循环结束,程序跳转到while循环之后的下一条语句执行。
int i = 0;
while (i < 5) {
printf("current is %d\n", i);
i++; // 在循环体内增加i的值
}
在这个例子中,只要变量i小于5,就会一直打印出i的当前值,并在每次循环后将i加1。当i达到5时,条件不再满足(即i < 5为假),循环停止执行。
最终依次打印的是0,1,2,3,4
do…while 结构
do...while
结构是while
的变体,它会先执行一次循环体,然后再判断是否满足条件。如果满足的话,就继续执行循环体,否则跳出循环。do...while
循环至少会保证循环体内的代码被执行一次,即使初始条件为假(零)。
do {
// 不管条件是否为真,都会先执行此处的循环体
循环体内的语句1;
循环体内的语句2;
// ...
} while (条件表达式); // 循环结束后才检查条件,如果条件为真,则继续循环
示例,最终依次打印的是0,1,2,3,4
#include <stdio.h>
int main() {
int count = 0;
do{
printf("current is %d\n",count++);
}while(count < 5);
return 0;
}
Q:如何理解do...while
循环至少会保证循环体内的代码被执行一次,即使初始条件为假(零)?
A:
#include <stdio.h>
int main() {
int count = 0;
do{
printf("this line will printed once \n");
count = 1;
}while(count == 0); // 初始条件下 count为0,但仍会执行一次循环体
}
在这个例子中,尽管初始时count
为0,不符合循环条件count== 0
,但循环体会执行一次并输出一行文本,然后在第二次检查条件时,因为count
已被修改为1,循环才会终止。
for 语句
在C语言中,for
循环是一种常用的循环结构,它可以方便地在一个语句中完成循环变量的初始化、条件测试以及循环变量更新这三个步骤。for循环的通用语法格式如下:
for (初始化; 条件表达式; 更新表达式) {
// 循环体内的语句
}
- 初始化:在循环开始之前执行一次,通常用于给循环变量赋初值。例如
int i = 0;
。 - 条件表达式:在每次循环迭代开始时评估,如果条件为真(非零),则执行循环体;如果为假(零),则退出循环。例如
i < 10
。 - 更新表达式:在每次循环体执行完毕后执行,通常用于改变循环变量的值以影响下次迭代的条件测试结果。例如
i++
(增加循环变量i的值)或i--
(减少循环变量i的值)。 - 循环体内的语句:在条件表达式为真的情况下将被执行的代码块。
#include <stdio.h>
int main() {
for(int i = 0; i < 10; i++) {
printf("%d",i);
};
return 0;
}
在这段代码中,i
从0
开始,每次循环迭代后i
加1
,当i的值达到10
时,条件i < 10
不再满足,循环结束。在循环过程中,每次迭代都会输出当前i的值。
break 语句
在C语言中,break
语句用于提前终止循环或开关(switch
)语句的执行。当break
语句被执行时,程序会立即跳出当前最内层的循环或switch
结构,并继续执行循环或switch
结构之后的下一条语句。
在循环中的应用:
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // 当i等于5时,跳出循环
}
printf("%d ", i);
}
在这个例子中,当变量i
等于5
时,break
语句被执行,循环会在第五次迭代时提前结束。
在switch
语句中的应用:
switch (expression) {
case 1:
printf("Case 1\n");
break;
case 2:
printf("Case 2\n");
break;
default:
printf("Default case\n");
}
// 如果expression等于1,打印"Case 1"后跳出switch结构
// 如果没有break,执行流会继续进入下一个case标签,除非遇到break或switch结构结束
在switch
语句中,break
语句用于结束当前case
的执行并退出整个switch
结构,防止出现“穿透”现象(即在没有break
的情况下,执行完一个case
中的语句后继续执行下一个case的语句)。
continue 语句
continue语句用于在循环体内部终止本轮循环,进入下一轮循环。只要遇到continue语句,循环体内部后面的语句就不执行了,回到循环体的头部,开始执行下一轮循环。
在循环中的应用:
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) { // 如果i是偶数
continue; // 跳过本次循环剩余的语句
}
printf("%d ", i); // 只会打印奇数
}
在这个例子中,当变量i
是偶数时,continue
语句被执行,程序会忽略这次循环中剩余的语句(即不会打印偶数),直接进入下一次循环的判断阶段(检查i < 10
是否仍为真),从而实现了只打印奇数的效果。
总结来说,continue
语句的作用是中断当前循环迭代的剩余部分,但不退出整个循环结构,而是继续执行下一轮循环的条件判断和循环体。