【C语言】分支和循环语句

本文详细介绍了C语言中的控制语句,包括if单分支、双分支和多分支语句,以及悬空else的概念。接着讲解了switch语句,强调了break在实现分支中的作用和default子句的应用。同时,文章涵盖了while、for和do-while循环的使用,以及break和continue在这些循环中的功能。最后提到了goto语句的使用及其在程序设计中的影响。
摘要由CSDN通过智能技术生成

1. 什么是语句?

C语句可分为以下五类:

  1. 表达式语句
  2. 函数调用语句
  3. 控制语句
  4. 复合语句
  5. 空语句

其中,控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。

可分为以下三类:

  1. 条件判断语句(分支语句)

    • if 语句
    • switch 语句
  2. 循环执行语句

    • while 语句
    • for 语句
    • do while 语句
  3. 转向语句

    • break 语句
    • continue 语句
    • return 语句
    • goto 语句

2. 分支语句

​ 通过对给定的条件进行判断,来决定执行两个分支或多个分支中的哪一支。因此,在编写之前,要先明确判断条件是什么,并确定当判断结果为”真“或”假“时应分别执行什么操作(算法)。

0表示假,非0表示真。

2.1 if 语句

语法结构:

//单分支
if (表达式)
    语句;

//双分支
if (表达式)
    语句1;
else
    语句2;

//多分支
if (表达式1)
    语句1;
else if (表达式2)
    语句2;
else
    语句3;

举例:

#include <stdio.h>

//代码1
int main()
{
	int age = 0;
    
	scanf("%d", &age);
	if (age < 18)
	{
		printf("未成年\n");
	}

	return 0;
}

//代码2
int main()
{
	int age = 0;
    
	scanf("%d", &age);
	if (age < 18)
	{
		printf("未成年\n");
	}
	else
	{
		printf("成年\n");
	}

	return 0;
}

//代码3
int main()
{
	int age = 0;
    
	scanf("%d", &age);
	if (age < 18)
	{
		printf("少年\n");
	}
	else if (age >= 18 && age < 30)
	{
		printf("青年\n");
	}
	else if (age >= 30 && age < 50)
	{
		printf("中年\n");
	}
	else if (age >= 50 && age < 80)
	{
		printf("老年\n");
	}
	else
	{
		printf("老寿星\n");
	}

	return 0;
}

运行结果:

代码1:

image-20230504212038357

代码2:

image-20230504212209664

代码3:

image-20230504212402082

2.1.1 悬空 else

当你写了这个代码:

#include <stdio.h>

int main()
{
	int a = 0;
	int b = 2;

	if (a == 1)
		if (b == 2)
			printf("hehe\n");
	else
		printf("haha\n");

	return 0;
}

运行结果:

image-20230504212553654

改正:

#include <stdio.h>

int main()
{
	int a = 0;
	int b = 2;

	if (a == 1)
	{
		if (b == 2)
		{
			printf("hehe\n");
		}
	}
	else
	{
		printf("haha\n");
	}

	return 0;
}

运行结果:

image-20230504212730485

else的匹配:else是和它离的最近的if匹配的。

通过对比,可以看出:适当的使用{}可以使代码的逻辑更加清楚。

所以说,代码风格很重要。

2.1.2 if 书写形式的对比

//代码1
if (condition)
{
    return x;
}
return y;

//代码2
if (condition)
{
    return x;
}
else
{
    return y;
}

//代码3
int num = 1;
if (num == 5)
{
    printf("hehe\n");
}

//代码4
int num = 1;
if (5 == num)
{
    printf("hehe\n");
}

其中,代码2和代码4更好,逻辑更加清晰,不容易出错。

2.2 switch 语句

switch语句常常用于多分支的情况。

语法结构:

switch (整型表达式)
{
        语句项;
}

语句项: 是一些case语句。

case 整型常量表达式:
	语句;

2.2.1 switch 语句中的 break

switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。

举例:

#include <stdio.h>

int main()
{
	int day = 0;
    
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("星期一\n");
		break;
	case 2:
		printf("星期二\n");
		break;
	case 3:
		printf("星期三\n");
		break;
	case 4:
		printf("星期四\n");
		break;
	case 5:
		printf("星期五\n");
		break;
	case 6:
		printf("星期六\n");
		break;
	case 7:		
		printf("星期天\n");
		break;
	}

	return 0;
}

运行结果:

image-20230504212912902

有时候我们的需求变了:

1.输入1-5,输出的是“weekday”;
2.输入6-7,输出“weekend”。

所以我们的代码就应该这样实现了:

#include <stdio.h>

int main()
{
	int day = 0;
    
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("weekday\n");
		break;
	case 6:
	case 7:		
		printf("weekend\n");
		break;
	}

	return 0;
}

运行结果:

image-20230504213018266

break语句 的实际效果是把语句列表划分为不同的分支部分。

编程好习惯

在最后一个case语句的后面加上一条break语句。

2.2.2 default 子句

举例:

#include <stdio.h>

int main()
{
	int day = 0;
    
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("weekday\n");
		break;
	case 6:
	case 7:		
		printf("weekend\n");
		break;
	default:
		printf("输入错误\n");
		break;
	}

	return 0;
}

运行结果:

image-20230504213253358

switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。

所以,每个switch语句中只能出现一条default子句。

default子句可以出现在语句列表的任何位置。

编程好习惯

在每个switch语句中都放一条default子句是个好习惯,甚至可以在后边再加一个break

3. 循环语句

3.1 while 循环

语法结构:

while (表达式)
    循环语句;

while 语句的执行流程图:

while 语句的执行流程图

举例:

#include <stdio.h>

int main()
{
	int i = 1;
    
	while (i <= 10)
	{
		printf("%d ", i);
		i++;
	}

	return 0;
}

运行结果:

image-20230504214605579

3.1.1 while 语句中的 break

举例:

#include <stdio.h>

//break 代码实例
int main()
{
	int i = 1;
    
	while (i <= 10)
	{
		if (5 == i)
			break;
        
		printf("%d ", i);
		i++;
	}

	return 0;
}

运行结果:

image-20230504213642566

总结:

breakwhile循环中的作用:永久终止循环。

3.1.2 while 语句中的 continue

举例:

#include <stdio.h>

//continue 代码实例1
int main()
{
	int i = 1;
    
	while (i <= 10)
	{
		if (5 == i)
			continue;
        
		printf("%d ", i);
		i++;
	}

	return 0;
}

//continue 代码实例2
int main()
{
	int i = 1;
    
	while (i <= 10)
	{
		i++;
		if (5 == i)
			continue;
        
		printf("%d ", i);
	}

	return 0;
}

运行结果:

continue 代码实例1:

image-20230504213844929

continue 代码实例2:

image-20230504213944436

总结:

continuewhile循环中的作用:跳过本次循环continue后边的代码,直接跳转到循环的判断部分。

3.2 for 循环

语法结构:

for (表达式1; 表达式2; 表达式3)
    循环语句;

表达式1

表达式1为初始化部分,用于初始化循环变量。

表达式2

表达式2为条件判断部分,用于判断循环什么时候终止。

表达式3

表达式3为调整部分,用于循环变量的调整。

for 语句的执行流程图:

for 语句的执行流程图

举例:

#include <stdio.h>

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

	return 0;
}

运行结果:

image-20230504214103576

3.2.1 for 语句中的 break

举例:

#include <stdio.h>

int main()
{
	int i = 0;
    
	for (i = 1; i <= 10; i++)
	{
		if (5 == i)
			break;
        
		printf("%d ", i);
	}

	return 0;
}

运行结果:

image-20230504214151308

总结:

breakfor循环中的作用:永久终止循环。

3.2.2 for 语句中的 continue

举例:

#include <stdio.h>

int main()
{
	int i = 0;
    
	for (i = 1; i <= 10; i++)
	{
		if (5 == i)
			continue;
        
		printf("%d ", i);
	}

	return 0;
}

运行结果:

image-20230504214246359

总结:

continuefor循环中的作用:跳过本次循环continue后边的代码,直接跳转到循环的调整部分。

3.3 do while 循环

语法结构:

do
    循环语句;
while (表达式);

do 语句的执行流程图:

do 语句的执行流程图

特点:

循环至少执行一次。

举例:

#include <stdio.h>

int main()
{
	int i = 1;
    
	do
	{
		printf("%d ", i);
		i++;
	} while (i <= 10);

	return 0;
}

运行结果:

image-20230504214605579

3.3.1 do 语句中的 break

举例:

#include <stdio.h>

int main()
{
	int i = 1;
    
	do
	{
		if (5 == i)
			break;

		printf("%d ", i);
		i++;
	} while (i <= 10);

	return 0;
}

运行结果:

image-20230504214722607

总结:

breakdo while循环中的作用:永久终止循环。

3.3.2 do 语句中的 continue

举例:

#include <stdio.h>

int main()
{
	int i = 1;
    
	do
	{
		if (5 == i)
			continue;

		printf("%d ", i);
		i++;
	} while (i <= 10);

	return 0;
}

运行结果:

image-20230504214847940

总结:

continuedo while循环中的作用:跳过本次循环continue后边的代码,直接跳转到循环的判断部分。

4. goto 语句

举例:

#include <stdio.h>

int main()
{
    int i = 0;

    for (i = 1; i <= 10; i++)
    {
        if (5 == i)
            goto end;

        printf("%d ", i);
    }

end:
    return 0;
}

运行结果:

image-20230504215346068

goto语句尽量少用,因为这不利于结构化程序设计,滥用它会使程序流程无规律、可读性差。

最常见的用法是在终止程序在某些深度嵌套的结构处理过程中使用。

例如:一次跳出两层或多层循环。

这种情况使用break是达不到目的的,因为break只能退出到上一层的循环。

goto语句真正适合的场景如下:

for (...)
    for (...)
    {
        for (...)
        {
            if (disaster)
                goto error;
        }
    }
	...
error:
	if (disaster)
        //处理错误情况
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值