03_控制语句

1 C语言中控制语句概述

在c语言中,控制逻辑主要包含三种:

1.顺序执行:

        所谓的顺序执行,指的程序按照特定先后顺序依次执行;也是C语言的特征(面向过程语言);

2.选择分支:

        在执行过程中,某些特殊的语句,需要满足特定条件才能执行。C语言中的选择分支可以使用if……else语句实现,也可以使用switch控制语句实现。

3.循环控制:

        在执行过程中,某些功能语句块,需要多次重复执行。C语言中可以使用for循环、while循环以及使用goto实现循环控制。

在程序设计的时候,所有的逻辑都是通过前面三种逻辑语句来综合实现。

2 选择分支语句

        在程序设计的时候,会因为不同条件会有不同的处理方式,通过调节控制语句实现逻辑。

2.1 if……else选择分支

1.if控制语句

        条件满足会执行,条件不满足不执行。也称为开关语句。

        语法形式:

if (条件表达式) {
    执行语句部分;        /* 当条件表达式结果为true,运行执行语句部分;当条件为false,执行语句部分不会执行 */
}

实例代码:

#include <stdio.h>

int main()
{
        int score;

        scanf("%d", &score);

        if (score >= 0 && score <= 100) {        
                printf("score = %d\n", score);
    /* 只有当输入成绩 [0,100] 才执行 */
        }   

        return 0;
}

2.if …… else 语句

if (条件表达式) {        /* 条件表达式结果为true运行执行语句1的部分;结果为false运行执行语句2的部分 */
    执行语句1部分
}
else 
{
    执行语句2部分
}

if……else实例

#include <stdio.h>

int main()
{
        int score;

        scanf("%d", &score);

        if (score >= 0 && score <= 100) {
                printf("score = %d\n", score);        /* 条件表达式为true的执行语句部分 */
        } else {
                printf("score error!\n");            /* 条件表达式为false的执行部分 */
        }   

        return 0;
}

3.if……else if…… 嵌套实现

#include <stdio.h>
int main()
{
        int score;

        scanf("%d", &score);

        if (score < 0 || score > 100) {
                printf("score error!\n");
                return -1;
        }   

        if (score >= 90 && score <= 100) {
                printf("A\n");
        } else if (score >= 80 && score < 90) {
                printf("B\n");
        } else if (score >= 70 && score < 80) {
                printf("C\n");
        } else if (score >= 60 && score < 70) {
                printf("D\n");
        } else {
                printf("E\n");
        }        
         return 0;
}

2.2 switch条件控制语句

switch(条件表达式) {        /* 条件表达式输出结果可以有多个结果,条件表达式的数据类型不能是浮点型数据 */
    case 条件表达式结果值1:
        执行语句部分1;
        break;                /*遇到break,语句一定结束 */
    case 条件表达式结果值2:    /* case不一定是本次执行的入口 */
        执行语句部分2;
        break;
    default:
        执行语句部分;
        break;
}

执行注意:

  • 在执行过程中会根据条件表达式的值进入到对应的case语句处开始向后顺序执行;
  • 如果找不到对应的case语句,进入到default语句处开始执行。
  • 不管是从那条case语句开始执行,只要遇到break,switch语句执行结束;
  • 进入到case语句后,只要没有遇到break,不管遇到多少次case语句,程序都会继续向后执行到break或者switch本身结束。
#include <stdio.h>

int main()
{
        int score;
        scanf("%d", &score);

        if(score < 0 || score > 100) {
                printf("score error\n");
                return -1; 
        }

        score /= 10;    /* 0,1,2,3,4,5,6,7,8,9,10 */ 

        switch(score) {
#if 0
                case 10:
                case 9:
#else
                case 9 ... 10:      /* 表示的是范围:9到10 的区间;需要注意符号(...) 左右两边有空格 */
#endif
                        printf("A\n");
                        break;
                case 8: 
                        printf("B\n");
                        break;
                case 7:
                        printf("C\n");
                        break;
                case 6:
                        printf("D\n");
                        break;
                default:        /* case 0 ... 5: */
                        printf("E\n");
                        break;
        }
        return 0;
}

3. 循环控制语句

        在某些情况下,执行语句需要连续多次执行,使用循环控制语句实现,可以减少代码量。

3.1 for循环控制语句

1.表达式1,用于初始化条件参数,可以省略表示用已有的初始参数值。

2.表达式2,实质式条件表达式,结果为true进入到循环体中执行,结果为false结束整个循环;可以省略默认为条件成立表示死循环。

3.表达式3,用于条件参数调节,可以省略表示参数不做调节(可以在循环体中调节)。

#include <stdio.h>
#include <unistd.h>

int main()
{
        int i;

        for (i = 0; i < 10; i++) {
                printf("i = %d\n", i); 
                sleep(1);
        }
     return 0;
}

3.2 while循环控制

3.2.1 while……do语句

        其实质就是通常所说的while语句;

while(条件表达式) {        /* 条件表达式结果为true进入到循环体中执行,结果为false结束整个循环 */
    循环体;        
}

while……do语句实例:

#include <stdio.h>
#include <unistd.h>

int main()
{
        int i = 0;        /* 循环条件参数的初始值需要循环执行之前设置 */

        while(i < 10) {        /* 循环条件判断,为true进入循环体执行,为false结束循环 */
                printf("i = %d\n", i++);    /* 循环参数调节,一般在循环体中实现。 */
                sleep(1);
        }

        return 0;
}

 3.2.2 do……while语句

do {
    循环执行语句;
} while(调节表达式);    /* 循环体每执行一次进行条件判断,为true进入到下一次循环体的执行,为false结束整个循环 */

do……while语句实例

#include <stdio.h>
#include <unistd.h>

int main()
{
        int i = 0;


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

3.2.3 while……do和do……while区别

相同点:

        都是使用while实现循环控制;当判断条件为false的时候结束循环。

不同点:

        1. 前者先判断,再执行;后者先执行再做判断;

        2. 前者可能一次都不执行,后者至少会执行一次。

3.3 goto语句

        所谓的goto语句,其实质是跳转语句,跳转到goto后面所跟的标签位置处。在goto跳转的时候可以向前跳转和向后跳转

#include <stdio.h>
#include <unistd.h>

int main()
{
        printf("%d\n", __LINE__);
        sleep(1);
        goto next;                      /* 向后跳转next标签位置处开始执行 */
        printf("%d\n", __LINE__);
        printf("%d\n", __LINE__);
loop:
        printf("%d\n", __LINE__);
        printf("%d\n", __LINE__);
next:
        printf("%d\n", __LINE__);
        printf("%d\n", __LINE__);
        goto loop;                    /* 向前跳转loop标签位置处开始执行,又能会构成循环过程 */
        printf("%d\n", __LINE__);
        printf("%d\n", __LINE__);

}

4 特殊语句

4.1 break语句

        所谓的break语句,也表示结束语句;

4.1.1 switch语句中break语句

        此时的break表示条件模块执行语句的结束。

4.1.2 循环控制语句中的break语句

        此时的break表示整个循环结束。

4.2 continue语句

        continue只有在循环控制语句中使用,表示结束本次循环(循环体中continue后面的所有语句都不在执行),直接进入下一次循环

4.3 return语句

        在模块中使用,表示整个函数模块的结束(在函数体中遇到return,函数调用结束)。具体的使用:

                1.只表示函数模块的结束,直接使用return ;

                2.返回状态:一般情况下使用整型数据表示,0 = 成功;-1表示失败;

                3.返回数据处理结果:可以是任意数据类型的数据和指针。

#include <stdio.h>
#include <unistd.h>

int main()
{
        int i = 0;

        while(i < 20) 
        {
               

                printf("i = %d\n", i++);
                if (i == 6) {
                        i += 2;
                        continue;        /* 在循环体中continue表示结束本次循环,进入下一次循环 */
                }
                if (i == 10) 
                        break;        /* 在循环体中,表示结束整个循环 */
                sleep(1);    
        }

        return 0;        /* 在函数模块中使用,表示返回函数的状态 */
}

5. 控制语句关键字

        在C语言中控制语句关键字一共有12个

1.选择分支语句关键字

        if、else、switch、case、default

2.循环控制语句关键字

        for、while、do、goto、

3.特殊语句关键字

        break、continue、return

使用随机数生成函数:

#include <stdlib.h>
int rand(void);            /* 随机数生成函数,根据随机因子生成随机数 */

void srand(unsigned int seed);    /* 随机因子生成函数,相同的seed会生成相同的随机因子,在默认情况下将程序的编译时间生成随机因子 */
#include <time.h>
time_t time(time_t *tloc);

随机数生成实例

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
        int num;

        srand(time(NULL));        /* time(NULL)获取当前时间,srand(time(NULL)) 获取当前时间并用于生成随机因子 */
        num = rand();
             /* 利用随机因子生成随机数 */
        printf("num = %d\n", num);
}

6 复习C语言中的关键字

在C语言中关键字有32个:

1.数据类型关键字:12个

        a.基本数据类型

                i.整型数据数据(6个)

                        char 1字节 值域: unsigned char :0 ~ 255; signed char -128 ~ 127;

                        short 2字节

                        int 2字节(16位系统)                    4字节(32位系统)

                        long 4字节(32位系统)                 8字节(64位系统)

                ii.浮点型数据 (2个)

                        float 4字节 精度范围:小数点后保留6位小数;

                        double 8字节

        b.构造数据类型 (3个)

                struct 结构体类型

                union 共用体类型

                enum 枚举类型

        c.特殊数据类型 (1个)

                void 不能定义变量。

2.存储类型关键字:(4个)

        auto 自动存储类型 所修饰的变量存储栈区;

        register 寄存器变量 存储在寄存器中,只能修饰局部变量。并且定义失败默认为auto变量。

        extern 外部声明引用 其实质不是用来定义变量,而是做变量的声明。

        static 静态

                修饰全局变量,改变变量的作用域(或者链接属性);

                修饰局部变量,改变变量的生命周期和存储位置。

3.控制语句关键字(12个)

        a.选择分支:

                if……else……、switch、case、default

        b.循环控制

                for、while、do、

        c.跳转语句

                goto

        d.特殊功能语句

                break、continue、return

4.特殊关键字(4个)

        sizeof 运算符关键字,计算数据(常量、数据类型、变量、指针)所占空间的大小。

        typedef 数据类型定义关键字,用于新的数据类型定义,或者给已有的数据类型取别名。

#include <stdio.h>

typedef int Int;        /* 使用typedef关键字实现数据类型的定义,原型为int */

int main()
{
        Int a = 34;     /* 定义Int类型的变量a,数据类型是int */

        printf("a = %d\n", a); 
}

volatile         异变,可变的意思,用来修饰变量。所修饰的变量防止编译器的优化处理

程序运行过程:

        程序中所定义的变量在运行的时候存储在虚拟内存中;

        程序的运行在CPU的寄存器中运行;

        数据会从内存搬移到寄存器中在运行;

编译器优化:

        程序在编译的时候,为了提高运行效率,编译器会优化程序(如果需要对同一个数据多次运算,只搬移1次,每次访问寄存器运行)。

防止优化:保证数据可靠,数据的每次运行都从内存中取数据,不要直接从寄存器中取数据。

volatile使用场景:

        1.对于寄存器数据访问的时候,主要就对于硬件设备编程。

        2.多任务编程的时候,多个任务需要对同一资源数据访问的时候。

const 用来修饰的变量,表示只读变量;

        所谓的只读变量,表示为不可以被修改的数据量。在C语言中不能被直接修改,可以间接修改。

#include <stdio.h>

int main()
{
        const int a = 34;     /* const修饰的变量为只读变量,不能直接修改 */
        int *p = &a;          /* 定义一个int类型指针变量存储变量a的地址 */
        printf("%d : a = %d\n", __LINE__, a); 
        //a = 123;        /* error,const修饰的变量为只读变量,不能直接修改 */
        *p = 321;
        printf("%d : a = %d\n", __LINE__, a); 


}

7 输入输出的实现

        在计算机中需要实现数据的输入和输出,使用输入输出函数实现。

7.1 输出函数

#include <stdio.h>
int printf(const char *format, ...);
功能:实现数据的标准输出功能,按照format格式实现输出功能
格式信息:按照%格式字符标记,跟上一个输出数据内容。

利用printf函数可以实现数据的输出,在输出过程中,可以调节输出格式,和输出字体颜色和背景颜色。

7.2 字符输出

int putchar(int c);
功能:将传递的参数c通过标准输出。

7.3 数据的输入

#include <stdio.h>
int scanf(const char *format, ...);
功能:按照format字符串格式进行数据的输入,在输入过程中,严格按照格式输入,接收使用的变量空间地址。

7.4 字符读取

int getchar(void);    /* 从表中输入流读取一个字符 */
#include <stdio.h>

int main()
{
        int a;
        int b;
        int c;
        int i;

        char ch; 

        scanf("%d %d %d", &a, &b, &c);    /* 按照格式输入数据:1 2 3 */
        getchar();
                        /* 字符输入,接收在scanf输入语句结束时回车换行符 */
        printf("a = %d, b = %d, c = %d\n", a, b, c); 

        char buf[4];
        for (i = 0; i < 4; i++) {
                scanf("%c", &buf[i]);     /* 每次输入一个字符 */ 
                getchar();                /* 字符输入,接收在scanf输入语句结束时回车换行符 */
        }

        for (i = 0; i < 4; i++) {
                printf("%c\n", buf[i]);    /* 实现字符的输出 */
        }

        return 0;
}

PS:scanf函数的使用,有严格格式要求,很容易出现bug。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/432648.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前后端分离项目Docker部署指南(下)

目录 前言&#xff1a; 一.安装nginx 创建目录 上传nginx.conf至/data/nginx/conf文件夹中 运行启动容器 上传静态资源文件 ​编辑 访问结果 前言&#xff1a; 在上一篇博客中&#xff0c;我们深入探讨了如何使用Docker部署一个前后端分离的项目中的后端部分。我们构建…

JavaScript基础知识(三)

JavaScript基础知识&#xff08;三&#xff09; 一、事件1. 事件绑定2.事件流2.1 事件捕获与事件冒泡 3.事件对象扩展3.1 阻止事件冒泡3.2 事件默认行为 4.事件委托5.事件类型5.1 鼠标事件5.2 键盘事件5.3 触屏事件 二、计时器方法1. setInterval 与 clearInterval2. setTimeou…

CMake 围炉札记

文章目录 一、CMake二、CMake 的一些用法1、指定 utf8 编码2、cmake rpath3、cmake 编译Release版本4、cmake重新编译5、cmake 不优化6、cmake 设置定义7、cmake 生成动态库8、cuda 一、CMake CMake 教程 Cmake官方教程解析 跨平台编译 VSCode 和 CLion Android CMake/JNI 二…

mac报错:zsh:command not found: brew

1、基本概述&#xff1f; 在使用brew安装程序的时候MAC提示&#xff1a; zsh:command not found: brew 本质就是brew没有安装&#xff0c;这个命令与linux系统中的yum命令类似。 使用的环境说明&#xff1a; 虚拟机版本&#xff1a;VMware Workstation 17 Pro mac os Ventu…

【风格迁移】StyTr2:引入 Transformer 解决 CNN 在长距离依赖性处理不足和细节丢失问题

StyTr2&#xff1a;引入 Transformer 解决 CNN 在长距离依赖性处理不足和细节丢失问题 提出背景StyTr2 组成StyTr2 架构 全流程优化原始子解法&#xff1a;VGG网络做内容特征提取替换子解法&#xff1a;使用GANs中的判别器进行特征提取 提出背景 论文&#xff1a;https://arxi…

如何选学生用的台灯?三分钟看懂护眼台灯怎么选!

其实仔细观察与经历过来的父母都知道&#xff0c;孩子从小用眼健康&#xff0c;最为重要的就是从他们开始坐到书桌前的那一时刻开始的&#xff0c;尤其是桌上的那一盏台灯。市面上很多劣质台灯&#xff0c;它们往往在许多看不见的细节上偷工减料&#xff0c;列如使用低质量处理…

持续更新 | 与您分享 Flutter 2024 年路线图

作者 / Michael Thomsen Flutter 是一个拥有繁荣社区的开源项目&#xff0c;我们致力于确保我们的计划公开透明&#xff0c;并将毫无隐瞒地分享从问题到设计规范的所有内容。我们了解到许多开发者对 Flutter 的功能路线图很感兴趣。我们往往会在一年中不断更改并调整这些计划&a…

MySQL--优化(索引)

MySQL–优化&#xff08;SQL语句执行慢&#xff0c;如何分析&#xff09; 定位慢查询SQL执行计划索引 存储引擎索引底层数据结构聚簇和非聚簇索引索引创建原则索引失效场景 SQL优化经验 索引 索引&#xff08;index&#xff09;是帮助 MySQL 高效获取数据的数据结构&#xff…

深入浅出Redis(四):Redis基于RDB、AOF的持久化

引言 Redis是一款基于内存的键值对数据结构存储系统&#xff0c;Redis基于内存且常用来缓存关系型数据库中的数据&#xff0c;但不代表着Redis不能进行持久化&#xff0c;本篇文章将深入浅出的说明Redis基于RDB和AOF的持久化方式 Redis支持两种持久化方式&#xff0c;RDB&…

Redis 缓存机制如何提高应用程序的性能?

在数字时代&#xff0c;一拍脑门儿我们就能感觉到信息的海量和处理速度的迫切。不管是刷个微博、下个单&#xff0c;还是玩个游戏&#xff0c;我们都希望能快上加快&#xff0c;一点不拖泥带水。这时候&#xff0c;缓存技术就扮演了个大英雄的角色&#xff0c;它能让数据存取的…

【排序】详解插入排序

一、思想 插入排序是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。具体步骤如下&#xff0c;将数组下标为0的元素视为已经排序的部分&#xff0c;从1开始遍历数组&#xff0c;在遍历的过程中当前元素从…

完美解决VMware中配置suse10虚拟机网络

一、注意&#xff01;&#xff01;&#xff01;配置suse10网络&#xff0c;需要在虚拟机关机状态下进行&#xff0c;否则会配置不成功&#xff1b; 二、配置与主机在同一网段(仅主机模式&#xff0c;网卡一)&#xff1b; 在suse系统关机状态下&#xff0c;Vmware中设置”虚拟网…

【每日一题】1976. 到达目的地的方案数-2024.3.5

题目: 1976. 到达目的地的方案数 你在一个城市里,城市由 n 个路口组成,路口编号为 0 到 n - 1 ,某些路口之间有 双向 道路。输入保证你可以从任意路口出发到达其他任意路口,且任意两个路口之间最多有一条路。 给你一个整数 n 和二维整数数组 roads ,其中 roads[i] = […

gofly接口入参验证使用介绍

接口传入的参数做相关性质验证是开发中较为常用&#xff0c;gofly框架内置校验工具&#xff0c;提供开发效率&#xff0c;开发接口简单调用即可实现验证&#xff0c;下面介绍gofly框架数据验证设计思路及使用方法。 gofly框架提供了功能强大、使用便捷、灵活易扩展的数据/表单…

Java并发编程-进程和线程

一、进程和线程 1. 进程 什么是进程&#xff1f; 简单来说&#xff0c;进程就是程序的一次启动和执行。进程是操作系统中的一个概念&#xff0c;它代表正在运行的程序的实例。每个进程都有自己的内存空间、代码和数据&#xff0c;以及其他操作系统资源&#xff0c;如文件和设备…

数据结构与算法-希尔排序

引言 在计算机科学中&#xff0c;数据结构和算法是构建高效软件系统的基石。而排序算法作为算法领域的重要组成部分&#xff0c;一直在各种应用场景中发挥着关键作用。今天我们将聚焦于一种基于插入排序的改进版本——希尔排序&#xff08;Shell Sort&#xff09;&#xff0c;深…

优思学院|质量和企业的盈利能力有何关系?

质量和企业的盈利能力有何关系&#xff1f;三十年前&#xff0c;这个问题就已经被提出。当时的学者们研究了高质量产品如何带来更高的盈利。虽然这听起来像是老生常谈&#xff0c;但它的真理至今仍深深影响着我们的商业决策。 为了更直观地理解&#xff0c;一些学者绘制了以下…

力扣大厂热门面试算法题 - 滑动窗口

最长和谐子序列、重复的DNA序列、找到字符串中所有字母异位词、滑动窗口最大值、最小区间。每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.06 可通过leetcode所有测试用例。 目录 594. 最长和谐子序列 解题思路 完整代码 Java Python …

亚信安慧AntDB:数据库自主创新的缩影

AntDB作为一款自主研发的数据库系统&#xff0c;具备了国产化升级改造的核心能力。这款数据库系统通过不懈努力和持续探索&#xff0c;实现了从跟随他人到引领潮流的华丽转身。AntDB不仅仅是一种技术产品&#xff0c;更是体现了自主研发能力的缩影&#xff0c;体现了科技企业在…

基于SSM的农业信息管理系统的设计与实现(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的农业信息管理系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;…