首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C语言】分支和循环(上)

【C语言】分支和循环(上)

作者头像
Yue丶越
发布2025-12-17 16:27:22
发布2025-12-17 16:27:22
1070
举报
文章被收录于专栏:C语言C语言

前言:

C语言作为一门结构化的程序设计语言,通过顺序结构选择结构循环结构这三种基本结构构建程序逻辑。无论是简单的数据判断还是复杂的算法实现,都离不开这些基础构建块。本文将深入探讨C语言中的分支与循环结构,结合代码实例与常见陷阱分析,帮助大家真正掌握这些核心概念。


一、if语句

1.1 if

if语句是C语言中最基本的分支结构,其语法形式如下:

if(表达式) { // 表达式为真时执行的代码 }

在C语言中,表达式成⽴(为真),则语句执行,表达式不成立(为假),则语句不执行

在C语⾔中,0为假,⾮0表示真,也就是表达式的结果如果是0,则语句不执行,表达式的结果如果 不是0,则语句执行

代码语言:javascript
复制
#include <stdio.h>

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

1.2 else

当需要处理两种互斥情况时,if-else语句提供了完美的解决方案:

基本语法:

if ( 表达式 )   语句1 else   语句2

例子:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印数偶数。

代码语言:javascript
复制
#include <stdio.h>

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 分支中包含多条语句

一个常见的误区是认为if语句可以控制多行代码。但实际上,ifelse 都只默认控制紧随其后的一条语句

代码示例
代码语言:javascript
复制
#include <stdio.h>

int main() {
    int age = 0;
    scanf("%d", &age);
    
    if (age >= 18)
        printf("成年了\n");  // 仅此语句受if控制
        printf("可以考驾照了\n");  // 始终执行
    
    return 0;
}

上面的代码,你会发现输入的值不管是>=18 还是小于18,"可以考驾照了"都会打印在屏幕上。

输出结果

10 可以考驾照了

20 成年了 可以考驾照了

这是因为if语句只能控制⼀条语句,就是printf(“成年了\n”); ,if语句为真,则打印成年了,if语句为假,则不印,对于printf(“可以考驾照了\n”); 是独⽴存在的,不管if语句的条件的真假,都会被执⾏。那如果我们要if语句同时控制2条语句,怎么办呢?那就要使用“”{ }“”将代码括起来,else后也可以跟上⼤括号。

如下:
代码语言:javascript
复制
#include <stdio.h>

int main() {
    int age = 0;
    scanf("%d", &age);
    
    if (age >= 18)
    {
        printf("成年了\n");  // /if 后使⽤{} 控制多条语句这个块也叫:程序块,或者复合语句
        printf("可以谈恋爱了\n");  
    }
    return 0;
}

1.4 嵌套if

在 if else 语句中, else 可以与另⼀个 if 语句连⽤,构成多重判断。

代码示例

eg:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数。

代码语言:javascript
复制
#include <stdio.h>
int main()
{
 int num = 0;
 scanf("%d", &num);
 if(num == 0)
     printf("输⼊的数字是0\n");
 else if(num > 0) //这⾥的if 相当于嵌套在else语句中,形成了嵌套结构
     printf("输⼊的数字是正数\n");
 else
     printf("输⼊的数字是负数\n");
 
 return 0;
}

1.5悬空else问题

if 语句可以嵌套使用,但需要注意else的匹配规则:​else总是与最近未匹配的if配对。

代码语言:javascript
复制
#include <stdio.h>

int main() {
    int a = 0;
    int b = 2;
    
    if (a == 1)
        if (b == 2)
            printf("hehe\n");
    else  // 这个else与内层的if(b == 2)匹配
        printf("haha\n");
    
    return 0;
}

为了便于大家理解,我们将这段代码修改一下。

代码语言:javascript
复制
#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;
}

只要带上适当的⼤括号,代码的逻辑就会更加的清晰,所以⼤家以后在写代码的时候要注意括号的使 ⽤,让代码的可读性更⾼。


二、 关系操作符

C语言主要提供了6种关系操作符用于比较

  • 大于运算符 >
  • 小于运算符 <
  • 大于等于运算符 >=
  • 小于等于运算符 <=
  • 相等运算符 ==
  • 不相等运算符 !=

关系表达式通常返回 0 或 1,表示真与假。C语言中,0 表示假,所有非 0 值表示真。

但要注意的是:相等运算符==与赋值运算符=是两个不⼀样的运算符,不要混淆。有时候,可能会不小心写 出下面的代码,它可以运行,但很容易出现意料之外的结果。

代码语言:javascript
复制
  if (x = 4) ...

另⼀个需要避免的错误是:多个关系运算符不宜连用

代码语言:javascript
复制
i < j < k;//实际上,编译器执行的表达式为 (i<j)<k
正确写法:
代码语言:javascript
复制
i < j && j < k
示例代码

例子:我们输入一个年龄,如果年龄在18岁~36岁之间,我们输出青年。

代码语言:javascript
复制
#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
 if(age>=18 && age<=36)
 {
 printf("⻘年\n");
 }
 return 0;
}
}
输出结果

10

19 青年


三、 条件操作符

条件操作符也叫三目操作符,需要接收三个操作数的,形式如下:

exp1 ? exp2 : exp3

条件操作符的计算逻辑是:如果exp1为真,则执行exp2;若exp1为假,则执行exp3。

代码示例

例子:使用条件操作符号表示下面代码的逻辑

代码语言:javascript
复制
#include <stdio.h>
int main()
{
 int a = 0;
 int b = 0;
 scanf("%d", &a);
 if (a > 5)
 b = 3;
 else
 b = -3;
 printf("%d\n", b);
 return 0;
}

 改造后:

#include <stdio.h>
int main()
{
 int a = 0;
 int b = 0;
 scanf("%d", &a);
 b = a>5 ? 3:-3;
 printf("%d\n", b);
 return 0;
}

四、 逻辑操作符

4.1 与运算符

&& 与运算符(表并且),是个双目操作符,即:a&&b,&&两边的表达式都为真的时候,整个表达式才为真,有一个假,则整个表达式为假。( 全真全真,一假全假)

代码示例

例子:如果我们说一年中3月到5月是春天,那么我们该怎么用代码实现呢?

代码语言:javascript
复制
#include <stdio.h>
int main()
{
	int month = 0;
	scanf("%d", &month);
	if(month >= 3 && month <= 5)
	 {
   	printf("春季\n");
	}
 	return 0;
 }

4.2 或运算符

|| 或运算符(表或者),也是⼀个双目操作符,使用的方式是 a || b , || 两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。(一真全真,全假才假)

代码示例

例子:如果我们说⼀年中12月或者1月或2月是冬天,那么我们该怎么用代码实现呢?

代码语言:javascript
复制
#include<stdio.h>
int main()
{
    int month = 0; 
    scanf("%d", &month);
    if (month == 12 || month == 1 || month == 2)
    {
        printf("冬天\n");
    }
    return 0;
}

4.3 非运算符

! 逻辑取反运算符,改变单个表达式的真假(非真为假,非假为真

代码示例
代码语言:javascript
复制
# include <stdio.h>
int main()
{
	int a = 0;
	
	if (!a) // 当!a为真时 (!0 = 1, 为真, 执行该语句块)
	{
		printf("!a为真\n");
	}
	if (a) // 当a为真时 (a = 0, 为假, 不执行该语句块)
	{
		printf("a为真\n");
	}
	return 0;
}
输出结果

!a 为真

4.5 短路

C语言逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。

对于&&,左操作数为“假”时,不再计算右操作数

代码示例

例子

代码语言:javascript
复制
   if(month >= 3 && month <= 5)
	 {
   	   printf("春季\n");
	 }

表达式中&&的左操作数是 month>= 3,右操作数是 month <= 5,当左操作数 month >=3 的结果是0的时候,即使不判断 month<=5,整个表达式的结果也是0(不是春季)。所以,对于&&操作符来说,左边操作数的结果是 0 的时候,右边操作数就不再执行了。

对于 | |, 左操作数为“真”时,不再计算右操作数

代码示例

例子

代码语言:javascript
复制
    if (month == 12 || month == 1 || month == 2)
    {
        printf("冬天\n");
    }

如果 month ==12,则不用再判断 month 是否等于1或者2,整个表达式的结果也是1(是冬季)。所以,| | 操作符的左操作数的结果不为0时,就无需执行右操作数。


五、 switch语句

在 C 语言的分支结构中,除了 if-else 语句,switch 语句也是实现多分支选择的重要工具。

5.1 switch

基本语法:

switch(表达式) { case 常量1:       执行语句; break; (表示分支执行结束,跳出 switch) case 常量2:       执行语句; break;   … case 常量N:       执行语句; break; default:       其他情况执行语句; (所有 case 都不满足时执行) break; }

上面的代码中,根据表达式值的不同,执行相应的 case 分支。如果找不到对应的值,就执行 default 分支。

5.2 case穿透

如果一个 case 分支后没有写 break,那么执行完当前 case 的代码后,会继续向下执行下一个 case 的代码,直到遇到 break 或者 switch 结束 —— 这就称之为 case 穿透

在大多数情况下,每个case分支都应该有对应的break语句,这样可以确保执行完一个分支后立即退出switch结构。

case 1:   printf(“xxx\n”); break; // 防止穿透到下一个case

但有时我们也可以有意利用case穿透来简化代码

代码语言:javascript
复制
#include <stdio.h>

int main(void)
{
    int day;
    printf("请输入星期(1-7):");
    scanf("%d", &day);

    switch (day)
    {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            printf("工作日\n");
            break;
        case 6:
        case 7:
            printf("休息日\n");
            break;
        default:
            printf("输入无效\n");
            break;
    }

    return 0;
}

这里利用 case 穿透,让周一到周五都执行 “工作日” 的逻辑,周六周日执行 “休息日” 的逻辑,代码既简洁又清晰明了。

5.3 switch语句中的case和default的顺序问题

switch语句中,case 语句和 default 语句是没有顺序要求的,只满足实际需求即可。但通常我们是把 default 语句放在最后来处理。


以上就是本期博客的全部内容了,感谢各位的阅读以及关注。如有内容存在疏漏或不足之处,恳请各位技术大佬不吝赐教、多多指正。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • 一、if语句
    • 1.1 if
    • 1.2 else
    • 1.3 分支中包含多条语句
    • 1.4 嵌套if
    • 1.5悬空else问题
  • 二、 关系操作符
  • 三、 条件操作符
  • 四、 逻辑操作符
    • 4.1 与运算符
    • 4.2 或运算符
    • 4.3 非运算符
    • 4.5 短路
  • 五、 switch语句
    • 5.1 switch
    • 5.2 case穿透
    • 5.3 switch语句中的case和default的顺序问题
      • 以上就是本期博客的全部内容了,感谢各位的阅读以及关注。如有内容存在疏漏或不足之处,恳请各位技术大佬不吝赐教、多多指正。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档