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

练习:

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

相关推荐
hrrrrb14 分钟前
【C语言】指针篇
c语言·数据结构·算法
weixin_3077791326 分钟前
PyTorch调试与错误定位技术
开发语言·人工智能·pytorch·python·深度学习
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧1 小时前
C语言_数据结构总结4:不带头结点的单链表
c语言·开发语言·数据结构·算法·链表·visualstudio·visual studio
极客代码1 小时前
Linux IPC:System V共享内存汇总整理
linux·c语言·开发语言·并发·共享内存·通信·system v
orangapple1 小时前
一个差劲的软件设计
开发语言·c#
算法与编程之美1 小时前
冒泡排序
java·开发语言·数据结构·算法·排序算法
Aphelios3801 小时前
Java 学习记录:基础到进阶之路(一)
java·开发语言·学习·idea
白总Server1 小时前
Bash和Zsh在处理大文件时优化方法
开发语言·网络·ide·stm32·安全·udp·bash
苦逼的老王1 小时前
java之uniapp实现门店地图
java·开发语言·uni-app
一条晒干的咸魚2 小时前
【C#学习笔记03】进制转换与反码、补码、原码
开发语言·笔记·学习·c#