C语言基础:流程控制

流程控制

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;
}

如果有多个ifelse,可以记住这样一条规则,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 (初始化; 条件表达式; 更新表达式) {
    // 循环体内的语句
}
  1. 初始化:在循环开始之前执行一次,通常用于给循环变量赋初值。例如 int i = 0;
  2. 条件表达式:在每次循环迭代开始时评估,如果条件为真(非零),则执行循环体;如果为假(零),则退出循环。例如 i < 10
  3. 更新表达式:在每次循环体执行完毕后执行,通常用于改变循环变量的值以影响下次迭代的条件测试结果。例如 i++(增加循环变量i的值)或 i--(减少循环变量i的值)。
  4. 循环体内的语句:在条件表达式为真的情况下将被执行的代码块。
#include <stdio.h>

int main() {
	for(int i = 0; i < 10; i++) {
		printf("%d",i);
	};
	return 0; 
}

在这段代码中,i0开始,每次循环迭代后i1,当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语句的作用是中断当前循环迭代的剩余部分,但不退出整个循环结构,而是继续执行下一轮循环的条件判断和循环体。

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值