当前位置: 首页 > article >正文

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

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

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

1. if 语句

    1.1 基本形式与原理

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

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。以判断整数是奇数还是偶数为例: 

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语句只控制一条语句。若要控制多条语句,需使用大括号{}将代码括起来,形成程序块或复合语句。例如:

    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、正数还是负数:

    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匹配。例如:

    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 之后的余数:

    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)

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

    2. 条件操作符

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

    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为假,执行特定操作:

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

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

    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)

      

    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 的值:

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

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

        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循环的代码为:

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

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

            

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

        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 的值,代码如下:

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

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

        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 时终止循环:

          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 的数字,内层循环判断每个数字是否为素数。

          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语句会更加便捷。

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

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

          练习:

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


          http://www.kler.cn/a/585800.html

          相关文章:

        1. 字符串哈希
        2. 【硬件测试】基于FPGA的16PSK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR
        3. 数学建模之数学模型-3:动态规划
        4. C# 集合
        5. 卷积神经网络(CNN)之 EfficientNet
        6. 【RTSP】客户端(三) 音频相关
        7. 计算机视觉算法实战——花卉识别(主页有源码)
        8. Spring框架详解(IOC容器-上)
        9. JVM 如何保证 Java 程序的安全性?
        10. TypeScript 高级类型 vs JavaScript:用“杂交水稻”理解类型编程
        11. 【redis】set 类型:基本命令
        12. 遥感数据获取、处理、分析到模型搭建全流程学习!DeepSeek、Python、OpenCV驱动空天地遥感数据分析
        13. WPF程序使用AutoUpdate实现自动更新
        14. Secs/Gem第一讲(基于secs4net项目的ChatGpt介绍)
        15. 完善机器人:让 DeepSeek 使用Vue Element UI快速搭建 AI 交互页面
        16. 【Linux系统编程】管道
        17. 什么是mysql索引回表?
        18. 杨辉三角形(信息学奥赛一本通-2043)
        19. 智慧应急消防解决方案(35页PPT)(文末有下载方式)
        20. doris:SQL 方言兼容