C 语言分支与循环:构建程序逻辑的基石

在 C 语言的世界里,分支和循环结构是编程的核心内容,它们赋予了程序根据不同条件执行不同操作以及重复执行特定代码段的能力,让程序变得更加智能和高效。今天,我们就深入探讨 C 语言分支和循环的相关知识,助力大家夯实编程基础。

一. 分支结构:if 语句与 switch 语句

1. if 语句

1.1 基本形式与原理

if 语句是 C 语言中最常用的分支结构之一。其基本语法为if (表达式) 语句,当表达式的值为非 0(在 C 语言中,非 0 表示真)时,执行后面的语句;若表达式的值为 0(表示假),则语句不执行 。例如,在判断一个整数是否为奇数的代码中:

cpp 复制代码
int main()
{
    int num = 0;
    scanf("%d", &num);
    if(num % 2 == 1)
        printf("%d是奇数\n", num);
    return 0;
}

这里通过num % 2 == 1这个表达式来判断num是否为奇数,若满足条件则打印相应信息。

1.2 if...else... 结构

为了更全面地进行条件判断,if...else...结构应运而生。语法为if (表达式) 语句1 else 语句2,当表达式为真时执行语句1,否则执行语句2。以判断整数是奇数还是偶数为例:

cpp 复制代码
int main()
{
    int num = 0;
    scanf("%d", &num);
    if(num % 2 == 1)
        printf("%d是奇数\n", num);
    else
        printf("%d是偶数\n", num);
    return 0;
}
1.3 控制多条语句

默认情况下,ifelse语句只控制一条语句。若要控制多条语句,需使用大括号{}将代码括起来,形成程序块或复合语句。例如:

cpp 复制代码
int main()
{
    int age = 0;
    scanf("%d", &age);
    if(age >= 18) 
    {
        printf("成年了\n");
        printf("可以谈恋爱了\n");
    }
    else 
    {
        printf("未成年\n");
        printf("不可以早恋哦\n");
    }
    return 0;
}
1.4 嵌套if语句:

if else语句中,else可以与另一个if语句连用,构成嵌套 if 语句,实现更复杂的逻辑判断。比如判断一个整数是 0、正数还是负数:

cpp 复制代码
int main()
{
    int num = 0;
    scanf("%d", &num);
    if(num == 0)
        printf("输入的数字是0\n");
    else if(num > 0) 
        printf("输入的数字是正数\n");
    else
        printf("输入的数字是负数\n");
    return 0;
}
1.5 悬空 else 问题:

当存在多个ifelse时,else总是与最接近的if匹配。例如:

cpp 复制代码
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
        if(b == 2)
            printf("hehe\n");
        else
            printf("haha\n");
    return 0;
}

这段代码中,else实际上与第二个if匹配,若想让else与第一个if匹配,需添加大括号,增强代码可读性

2. switch 语句

2.1 基本形式和应用场景:

switch语句是另一种实现分支结构的方式,适用于判断条件有多个结果的情况。其语法为:

switch (expression)

{

case value1: statement;

case value2: statement;

default: statement;

}

根据expression的值执行相应的case分支,若找不到匹配值,则执行default分支。例如,计算整数除 3 之后的余数:

cpp 复制代码
int main()
{
    int n = 0;
    scanf("%d", &n);
    switch(n%3)
    {
    case 0:
        printf("整除,余数为0\n");
        break;
    case 1:
        printf("余数是1\n");
        break;
    case 2:
        printf("余数是2\n");
        break;
    default :
        printf("没有匹配的值");
        break;
    }
    return 0;
}

n%3的计算结果如果等于0 1 2就执行相应的语句,没有相等的值就执行default后面的语句

2.2 break 的重要性

switch语句中,break用于跳出switch语句。若某case语句后没有break,代码会继续执行后续case语句,直到遇到breakswitch语句结束。例如,去掉上述代码中的break,会出现不符合预期的结果。

2.3 default 子句

switch后的表达式的值无法匹配代码中的case语句时,可使用default子句进行处理。比如在打印星期的练习中,可用于提示输入错误。

2.4 case 和 default 的顺序

switch语句中case子句和default子句没有严格的顺序要求,但通常将default子句放在最后。

二、关系操作符、条件操作符与逻辑操作符

1. 关系操作符

C 语言中的关系操作符包括><>=<===!=,用于比较两个值的大小或是否相等,构成关系表达式。关系表达式的结果通常为 0(假)或 1(真) 。使用时需注意,相等运算符==与赋值运算符=不同,同时应避免多个关系运算符连用。例如,判断年龄是否在 18 岁到 36 岁之间,正确的写法是if(age>=18 && age<=36),而不是if(18<=age<=36)

cpp 复制代码
int main()
{
    int age = 30;
    if(age>18)
    {
        printf("长大了");
    }
    else
    {
        printf("小孩");
    }
    return 0;
}

2. 条件操作符

条件操作符也叫三目操作符,形式为exp1? exp2: exp3。其计算逻辑是:若exp1为真,计算exp2,其结果为整个表达式的结果;若exp1为假,计算exp3,其结果为整个表达式的结果。

cpp 复制代码
int main()
{

    int a = 3;
    int b = 4;
    int c = a > b ? 3 : 4;//如果a大于b给c赋值3,反之,赋值4
    printf("%d",c);
    return 0;
}

3. 逻辑操作符

3.1 逻辑取反运算符!

用于改变单个表达式的真假。例如,若flag为假,执行特定操作:

cpp 复制代码
int main()
{
    int flag = 0;
    if(!flag)
    {
        printf("do something\n");
    }
    return 0;
}
3.2 逻辑与运算符&&

表示并且的意思,只有当两侧表达式都为真时,整个表达式才为真。如判断月份是否在 3 月到 5 月(春天):if(month >= 3 && month <= 5)

cpp 复制代码
int main()
{
    int month = 4;
    if(month >= 3 && month <= 5)//两个条件同时满足就执行下面的语句
    {
       printf("春天");
    }
    else
    { 
       ;
    }
    return 0;
}
3.3 逻辑或运算符 ||:

表示或者的意思,只要两侧表达式至少有一个为真,整个表达式就为真。如判断月份是否是 12 月、1 月或 2 月(冬天):if(month == 12 || month==1 || month == 2)

cpp 复制代码
int main()
{
    int month = 4;
    if(month == 3 || month == 5 || month== 4)//三个条件满足一个就执行下面的语句
    {
       printf("春天");
    }
    else
    { 
       ;
    }
    return 0;
}
3.4 短路现象:

C 语言逻辑运算符具有短路特性,总是先对左侧表达式求值,再对右侧表达式求值。若左侧表达式满足逻辑运算符的条件,就不再对右侧表达式求值。例如,在if(month >= 3 && month <= 5)中,当month >= 3为假时,就不再判断month <= 5

三、循环结构:while 循环、for 循环与 do - while 循环

1. while 循环

语法与执行流程while循环的语法为while(表达式) 语句。执行时先判断表达式的值,若为 0 则循环结束,若为非 0 则执行循环语句,之后再次判断表达式,如此循环。

实践应用:例如,在屏幕上打印 1 到 10 的值:

cpp 复制代码
int main()
{
    int i = 1;
    while(i<=10)
    {
        printf("%d ", i);
        i = i+1;
    }
    return 0;
}

练习 :输入一个正整数,逆序打印其每一位。通过n%10获取最低位,n=n/10去掉最低位,利用while循环实现

cs 复制代码
int main()
{
	int a = 1234;
	while (a)
	{
		printf("%d ", a % 10);
		a = a / 10;
	}
	return 0;
}

2. for 循环

语法与执行流程for循环的语法为for(表达式1; 表达式2; 表达式3) 语句。其中,表达式1用于循环变量的初始化,表达式2用于循环结束条件的判断,表达式3用于循环变量的调整 。执行时先执行表达式1,再判断表达式2,若为真则执行循环语句,之后执行表达式3,然后再次判断表达式2,直到表达式2为假时循环结束。

实践应用 :同样是在屏幕上打印 1 到 10 的值,for循环的代码为:

cpp 复制代码
int main()
{
    int i = 0;
    for(i=1; i<=10; i++)
    {
        printf("%d ", i);
    }
    return 0;
}

与 while 循环的对比for循环和while循环都有初始化、判断、调整三个部分,但for循环的这三个部分更集中,便于代码维护,在形式上更具优势

练习:计算 1 到 100 之间 3 的倍数的数字之和,可通过优化循环直接产生 3 的倍数来提高效率。

cpp 复制代码
int main()
{
	int sum = 0;
	for (int i = 3; i <= 100; i = i + 3)
	{
		sum = sum + i;
	}
	printf("%d ", sum);
	return 0;
}

3. do - while 循环

语法与执行流程do - while循环的语法为do 语句; while(表达式);。它先执行循环体语句,再判断表达式的值,若为真则继续循环,若为假则结束循环。其特点是循环体至少执行一次。

实践应用:在屏幕上打印 1 到 10 的值,代码如下:

cs 复制代码
int main()
{
    int i = 1;
    do
    {
        printf("%d ", i);
        i = i + 1;
    }while(i<=10);
    return 0;
}

练习 :输入一个正整数,计算其位数。使用do - while循环,因为即使输入的数是 0,也可作为 1 位数统计

cpp 复制代码
int main()
{
	int a = 0;
	int i = 0;
	scanf("%d", &a);
	do
	{
		a = a / 10;
		i++;
	} while (a);
	printf("%d", i);
	return 0;
}

四、break 和 continue 语句:循环控制的利器

(一)break 语句

break用于永久终止循环,一旦执行,直接跳出所在循环,继续执行循环后面的代码。在whilefordo - while循环中作用相同。例如,在while循环中,当i等于 5 时终止循环:

cpp 复制代码
int main()
{
    int i = 1;
    while(i<=10)
    {
        if(i == 5)
            break;
        printf("%d ", i);
        i = i+1;
    }
    return 0;
}

(二)continue 语句

continue用于跳过本次循环中continue后面的代码,直接进入下一次循环的判断。在while循环和for循环中表现略有不同,在while循环中跳到循环判断位置,而在for循环中会跳到循环调整部分。

五、循环的嵌套与 goto 语句

(一)循环的嵌套

三种循环(whiledo - whilefor)可以相互嵌套,解决更复杂的问题。例如,找出 100 到 200 之间的素数,需要使用两层循环,外层循环遍历 100 到 200 的数字,内层循环判断每个数字是否为素数。

cs 复制代码
int main()
{
	
	for (int i = 100; i <= 200; i++)
	{
		int falg = 0;
		for (int j = 2; j < i - 1; j++)
		{
			if (i % j == 0)
			{
				falg = 1;
				break;
			}

		}
		if (falg == 0)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

(二)goto 语句

goto语句可以实现在同一个函数内跳转到设置好的标号处。虽然使用不当会打乱程序执行流程,但在多层循环中,若想快速跳出循环,goto语句会更加便捷。

cpp 复制代码
int main()
{
 printf("hehe\n");
 goto next;
 printf("haha\n");
 
next:
 printf("跳过了haha的打印\n"); 
 return 0;
}

通过对 C 语言分支和循环知识的详细介绍,相信大家对这些重要的编程概念有了更深入的理解。在实际编程中,灵活运用这些知识,能够编写出更高效、更复杂的程序。希望大家不断练习,提升自己的编程技能!

练习:

线段图案_牛客题霸_牛客网

相关推荐
Scott9999HH4 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海5 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖6 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区9 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大9 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai9 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜9 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa10 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio