在 C 语言的世界里,分支和循环结构是编程的核心内容,它们赋予了程序根据不同条件执行不同操作以及重复执行特定代码段的能力,让程序变得更加智能和高效。今天,我们就深入探讨 C 语言分支和循环的相关知识,助力大家夯实编程基础。
一. 分支结构:if 语句与 switch 语句
1. if 语句
1.1 基本形式与原理:
if 语句是 C 语言中最常用的分支结构之一。其基本语法为
if (表达式) 语句
,当表达式的值为非 0(在 C 语言中,非 0 表示真)时,执行后面的语句;若表达式的值为 0(表示假),则语句不执行 。例如,在判断一个整数是否为奇数的代码中:
cppint 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
。以判断整数是奇数还是偶数为例:
cppint main() { int num = 0; scanf("%d", &num); if(num % 2 == 1) printf("%d是奇数\n", num); else printf("%d是偶数\n", num); return 0; }
1.3 控制多条语句:
默认情况下,
if
和else
语句只控制一条语句。若要控制多条语句,需使用大括号{}
将代码括起来,形成程序块或复合语句。例如:
cppint 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、正数还是负数:
cppint 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 问题:
当存在多个
if
和else
时,else
总是与最接近的if
匹配。例如:
cppint 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 之后的余数:
cppint 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
语句,直到遇到break
或switch
语句结束。例如,去掉上述代码中的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)
。
cppint main() { int age = 30; if(age>18) { printf("长大了"); } else { printf("小孩"); } return 0; }
2. 条件操作符
条件操作符也叫三目操作符,形式为
exp1? exp2: exp3
。其计算逻辑是:若exp1
为真,计算exp2
,其结果为整个表达式的结果;若exp1
为假,计算exp3
,其结果为整个表达式的结果。
cppint 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
为假,执行特定操作:
cppint main() { int flag = 0; if(!flag) { printf("do something\n"); } return 0; }
3.2 逻辑与运算符
&&
:表示并且的意思,只有当两侧表达式都为真时,整个表达式才为真。如判断月份是否在 3 月到 5 月(春天):
if(month >= 3 && month <= 5)
。
cppint 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)
。
cppint 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 的值:
cppint main() { int i = 1; while(i<=10) { printf("%d ", i); i = i+1; } return 0; }
练习 :输入一个正整数,逆序打印其每一位。通过
n%10
获取最低位,n=n/10
去掉最低位,利用while
循环实现
csint 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
循环的代码为:
cppint main() { int i = 0; for(i=1; i<=10; i++) { printf("%d ", i); } return 0; }
与 while 循环的对比 :
for
循环和while
循环都有初始化、判断、调整三个部分,但for
循环的这三个部分更集中,便于代码维护,在形式上更具优势练习:计算 1 到 100 之间 3 的倍数的数字之和,可通过优化循环直接产生 3 的倍数来提高效率。
cppint 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 的值,代码如下:
csint main() { int i = 1; do { printf("%d ", i); i = i + 1; }while(i<=10); return 0; }
练习 :输入一个正整数,计算其位数。使用
do - while
循环,因为即使输入的数是 0,也可作为 1 位数统计
cppint 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
用于永久终止循环,一旦执行,直接跳出所在循环,继续执行循环后面的代码。在while
、for
、do - while
循环中作用相同。例如,在while
循环中,当i
等于 5 时终止循环:
cppint 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 语句
(一)循环的嵌套
三种循环(
while
、do - while
、for
)可以相互嵌套,解决更复杂的问题。例如,找出 100 到 200 之间的素数,需要使用两层循环,外层循环遍历 100 到 200 的数字,内层循环判断每个数字是否为素数。
csint 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
语句会更加便捷。
cppint main() { printf("hehe\n"); goto next; printf("haha\n"); next: printf("跳过了haha的打印\n"); return 0; }
通过对 C 语言分支和循环知识的详细介绍,相信大家对这些重要的编程概念有了更深入的理解。在实际编程中,灵活运用这些知识,能够编写出更高效、更复杂的程序。希望大家不断练习,提升自己的编程技能!
练习: