C语言复习概要(一)

news2024/11/27 15:40:42

在这里插入图片描述

本文

      • C语言入门详解:从基础概念到分支与循环
        • 1. C语言常见概念
          • 1.1 程序的基本结构
          • 1.2 变量作用域和存储类
          • 1.3 输入输出
          • 1.4 编译与运行
        • 2. C语言中的数据类型和变量
          • 2.1 基本数据类型
          • 2.2 变量的声明与初始化
          • 2.3 常量与枚举
        • 3. C语言的分支结构
          • 3.1 if语句
          • 3.2 if-else语句
          • 3.3 嵌套if语句
          • 3.4 switch语句
          • 4.2 while循环
          • 4.3 do-while循环
          • 4.4 循环的控制语句
        • 5. 分支与循环的综合应用
          • 5.1 简单的计算器示例
          • 5.2 查找数组中的最大值
      • 总结

C语言入门详解:从基础概念到分支与循环

C语言作为现代编程语言的鼻祖之一,在系统编程、嵌入式开发、操作系统内核等领域占据了极其重要的位置。C语言以其简洁、高效、可移植性等特点,成为了很多其他高级语言(如C++、Java、Python)的基础。本文将深入探讨C语言的常见概念、变量和数据类型、分支结构以及循环结构,帮助初学者更好地掌握这门经典编程语言。


1. C语言常见概念

在学习任何编程语言之前,理解其核心概念至关重要。C语言的程序结构、函数、变量作用域、输入输出、编译运行等内容构成了其基本框架。

1.1 程序的基本结构

C语言的程序是由函数和语句组成的模块化代码集合,每个C语言程序至少有一个主函数,即main()函数。程序从main()函数开始执行,当程序结束时返回一个整数值,通常是0,表示程序成功运行。

基本结构

#include <stdio.h>  // 标准输入输出头文件

int main() {
    // 主函数体
    printf("Hello, World!\n");
    return 0;
}
  • #include <stdio.h>:这是一个预处理指令,用于引入标准输入输出库,该库包含printf()scanf()等常用函数。
  • int main():这是程序的主函数,程序的执行从这里开始。返回类型int表明函数返回整数值。
  • printf():这是一个输出函数,能够将字符串或变量值输出到控制台。
1.2 变量作用域和存储类

在C语言中,变量的作用域决定了它的可见性和生命周期,通常分为局部变量全局变量。局部变量只能在其声明的代码块内访问,而全局变量可以在整个程序中访问。

  • 局部变量:在函数或代码块内定义,函数执行结束时,局部变量被销毁。
  • 全局变量:在所有函数外部定义,可以在整个程序中访问。

存储类描述了变量的生命周期、初始值和存储方式,主要有以下几种:

  • auto:默认的局部变量存储类。
  • extern:用于声明一个全局变量或函数在其他文件中定义。
  • static:用于局部变量时,其值在函数结束后不会被销毁,用于全局变量时,其作用域限制在当前文件中。
  • register:提示编译器将变量存储在CPU寄存器中,以提高访问速度。

示例

#include <stdio.h>

int globalVar = 10;  // 全局变量

void func() {
    int localVar = 5;  // 局部变量
    printf("Local variable: %d\n", localVar);
}

int main() {
    func();
    printf("Global variable: %d\n", globalVar);
    return 0;
}

在这个示例中,globalVar是一个全局变量,localVar是局部变量。全局变量的值可以在程序的不同部分访问,而局部变量只能在函数func()中使用。

1.3 输入输出

C语言提供了丰富的输入输出功能。printf()用于向屏幕输出数据,scanf()用于从用户获取输入。

  • printf():格式化输出,用法类似于打印字符串或变量。
  • scanf():用于获取用户的输入,按格式指定的变量存储输入值。

代码示例

#include <stdio.h>

int main() {
    int age;
    printf("Enter your age: ");
    scanf("%d", &age);
    printf("Your age is: %d\n", age);
    return 0;
}

程序会提示用户输入年龄,然后通过scanf()将用户的输入值存储在变量age中,并使用printf()输出。

1.4 编译与运行

C语言是编译型语言,这意味着源代码需要通过编译器翻译成机器代码才能在计算机上执行。常见的C语言编译器有GCC(GNU Compiler Collection)、Clang、MSVC等。

编译流程

  1. 编写源代码并保存为.c文件。
  2. 使用编译器进行编译,如gcc命令:gcc program.c -o program
  3. 生成可执行文件,运行该文件:./program

2. C语言中的数据类型和变量

C语言的数据类型定义了变量可以存储的值的类型和范围。每种数据类型都有特定的存储需求和表示方式。

2.1 基本数据类型

C语言中的数据类型分为以下几类:

  • 整型int):用于存储整数。常见的整型有intshortlong,可以通过unsigned修饰符表示无符号整型。
  • 字符型char):用于存储单个字符,占用1个字节。
  • 浮点型float):用于存储小数,占用4个字节,精度较低。
  • 双精度浮点型double):精度高于float,占用8个字节。
  • 布尔型:虽然C语言没有专门的布尔类型,但我们通常使用整型,0表示false,非零值表示true

数据类型表

数据类型存储大小取值范围
char1字节-128 到 127 或 0 到 255
int2或4字节-32,768 到 32,767 或 -2^31 到 2^31-1
float4字节1.2E-38 到 3.4E+38
double8字节2.3E-308 到 1.7E+308
short2字节-32,768 到 32,767
long8字节-2^63 到 2^63-1
2.2 变量的声明与初始化

在C语言中,变量在使用之前必须先声明。声明变量时需要指定其类型,且可以在声明的同时为其赋初值。

  • 变量声明:告诉编译器该变量的类型和名称。
  • 变量初始化:为变量赋初值,防止未初始化变量的使用可能导致程序行为异常。

示例

#include <stdio.h>

int main() {
    int age = 25;  // 声明并初始化变量
    float weight = 70.5;
    char grade = 'A';
    
    printf("Age: %d, Weight: %.1f, Grade: %c\n", age, weight, grade);
    return 0;
}

这里我们定义了整型、浮点型和字符型变量,并进行了初始化。

2.3 常量与枚举

在C语言中,常量的值在程序执行过程中是不可更改的,使用const关键字定义常量。枚举(enum)是一种用户定义的数据类型,用于表示一组相关的常量。

常量示例

#include <stdio.h>

int main() {
    const int DAYS_IN_WEEK = 7;
    printf("There are %d days in a week.\n", DAYS_IN_WEEK);
    return 0;
}

枚举示例

#include <stdio.h>

enum Weekday {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};

int main() {
    enum Weekday today;
    today = Wednesday;
    printf("Today is day %d of the week.\n", today);  // 输出3
    return 0;
}

在上述程序中,枚举类型Weekday定义了7个常量,分别代表一周中的天数。


3. C语言的分支结构

分支结构使得程序可以根据条件执行不同的代码路径。在C语言中,常见的分支结构包括if语句、if-else语句、嵌套if语句和switch语句。

3.1 if语句

if语句是最基本的分支结构,它根据条件表达式的真假来决定是否执行某段代码。

语法

if (条件) {
    // 如果条件为真,执行这段代码
}

示例

#include <stdio.h

int main() {
    int number = 10;
    
    if (number > 0) {
        printf("The number is positive.\n");
    }

    return 0;
}

在这个示例中,程序根据number的值决定是否输出正数。

3.2 if-else语句

if-else语句在条件为假时执行另一个代码块。

语法

if (条件) {
    // 如果条件为真,执行这段代码
} else {
    // 如果条件为假,执行这段代码
}

示例

#include <stdio.h>

int main() {
    int number = -5;

    if (number >= 0) {
        printf("The number is non-negative.\n");
    } else {
        printf("The number is negative.\n");
    }

    return 0;
}

这个程序根据number的值判断它是非负数还是负数。

3.3 嵌套if语句

当多个条件需要嵌套判断时,可以使用嵌套if语句。它可以有效地处理复杂的条件。

示例

#include <stdio.h>

int main() {
    int number = 0;

    if (number > 0) {
        printf("The number is positive.\n");
    } else if (number < 0) {
        printf("The number is negative.\n");
    } else {
        printf("The number is zero.\n");
    }

    return 0;
}

这里,程序根据number的值进行三重判断,并输出相应的信息。

3.4 switch语句

switch语句适合用于多个可能的值来控制执行路径。相比多个if-else语句,switch结构更具可读性。

语法

switch (变量或表达式) {
    case1:
        // 当变量等于值1时执行
        break;
    case2:
        // 当变量等于值2时执行
        break;
    default:
        // 默认执行
}

示例

#include <stdio.h>

int main() {
    int day = 3;

    switch (day) {
        case 1:
            printf("Monday\n");
            break;
        case 2:
            printf("Tuesday\n");
            break;
        case 3:
            printf("Wednesday\n");
            break;
        case 4:
            printf("Thursday\n");
            break;
        case 5:
            printf("Friday\n");
            break;
        case 6:
            printf("Saturday\n");
            break;
        case 7:
            printf("Sunday\n");
            break;
        default:
            printf("Invalid day\n");
    }

    return 0;
}

 

在这个例子中,根据变量`day`的值,`switch`语句会打印对应的星期几。如果值不在17之间,默认会打印“Invalid day”。

---

#### 4. C语言中的循环结构

循环是编程中的重要控制结构,用于重复执行一段代码。C语言中常见的循环结构有`for`循环、`while`循环和`do-while`循环。

##### 4.1 for循环

`for`循环用于在已知循环次数的情况下执行循环,它将初始化、条件判断和迭代操作结合在一起。

**语法**:

```c
for (初始化; 条件; 迭代) {
    // 循环体
}

示例

#include <stdio.h>

int main() {
    for (int i = 0; i < 5; i++) {
        printf("i = %d\n", i);
    }
    return 0;
}

在这个例子中,for循环将变量i0增加到4,并在每次迭代中输出i的值。

4.2 while循环

while循环在条件为真时反复执行循环体,适合用于循环次数不确定的情况。

语法

while (条件) {
    // 循环体
}

示例

#include <stdio.h>

int main() {
    int i = 0;

    while (i < 5) {
        printf("i = %d\n", i);
        i++;
    }

    return 0;
}

这个程序与for循环类似,但使用了while循环来逐步增加i的值。

4.3 do-while循环

do-while循环和while循环类似,但它至少会执行一次循环体,因为条件是在循环体执行之后才进行判断的。

语法

do {
    // 循环体
} while (条件);

示例

#include <stdio.h>

int main() {
    int i = 0;

    do {
        printf("i = %d\n", i);
        i++;
    } while (i < 5);

    return 0;
}

即使初始值为i = 0do-while循环也会先执行循环体,然后再检查条件是否成立。

4.4 循环的控制语句

在C语言中,控制循环执行过程的语句包括breakcontinuegoto

  • break:用于立即终止循环,跳出当前循环体。
  • continue:跳过当前迭代的剩余部分,进入下一次迭代。
  • goto:一种直接跳转到程序中指定标签的语句,尽量避免使用,容易导致程序难以调试和理解。

示例:使用breakcontinue

#include <stdio.h>

int main() {
    for (int i = 0; i < 10; i++) {
        if (i == 5) {
            break;  // 当i为5时,终止循环
        }
        if (i % 2 == 0) {
            continue;  // 跳过偶数
        }
        printf("i = %d\n", i);
    }

    return 0;
}

这个程序会输出奇数并在i等于5时终止循环。


5. 分支与循环的综合应用

在编写实际的C语言程序时,往往会结合使用分支结构和循环结构,以实现更复杂的逻辑处理。

5.1 简单的计算器示例

一个基本的计算器程序,可以根据用户的输入进行加法、减法、乘法和除法运算,结合了分支结构和循环结构。

示例

#include <stdio.h>

int main() {
    char op;
    double num1, num2;

    while (1) {
        printf("Enter operator (+, -, *, /) or 'q' to quit: ");
        scanf(" %c", &op);

        if (op == 'q') {
            break;
        }

        printf("Enter two numbers: ");
        scanf("%lf %lf", &num1, &num2);

        switch (op) {
            case '+':
                printf("%.2lf + %.2lf = %.2lf\n", num1, num2, num1 + num2);
                break;
            case '-':
                printf("%.2lf - %.2lf = %.2lf\n", num1, num2, num1 - num2);
                break;
            case '*':
                printf("%.2lf * %.2lf = %.2lf\n", num1, num2, num1 * num2);
                break;
            case '/':
                if (num2 != 0) {
                    printf("%.2lf / %.2lf = %.2lf\n", num1, num2, num1 / num2);
                } else {
                    printf("Error! Division by zero.\n");
                }
                break;
            default:
                printf("Invalid operator.\n");
        }
    }

    return 0;
}

这个程序允许用户输入一个算术运算符和两个操作数,然后根据用户的选择进行运算,直到用户输入'q'退出程序。

5.2 查找数组中的最大值

结合分支结构和循环结构,我们还可以编写一个查找数组中最大值的程序。

示例

#include <stdio.h>

int main() {
    int n, i, max;
    
    printf("Enter number of elements: ");
    scanf("%d", &n);

    int arr[n];
    printf("Enter %d integers: ", n);

    for (i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    max = arr[0];  // 假设第一个元素为最大值

    for (i = 1; i < n; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }

    printf("The maximum value is: %d\n", max);

    return 0;
}

该程序通过for循环遍历数组中的每个元素,并使用if语句比较当前元素与最大值,最后输出数组中的最大值。


总结

本文详细介绍了C语言的常见概念、数据类型、变量的声明与初始化、分支结构以及循环结构,并通过多个代码示例展示了如何使用这些基本构件编写C语言程序。通过学习这些内容,初学者能够更好地理解C语言的基本结构和逻辑控制,为后续的高级编程技巧打下坚实的基础。

C语言的简单性和灵活性使其成为计算机科学中的核心编程语言。掌握了本文介绍的内容后,建议继续深入学习指针、数组、结构体、函数等高级话题,进一步提高编程能力。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python笔记 - 函数、方法和类装饰器

前言 装饰器最早出现是Python2.4版本&#xff0c;为什么这个版本开始存在&#xff1f;这是因为最早标记类方法的做法是&#xff1a; def foo(self):perform method operation foo classmethod(foo)当方法体过长的时候很容易让人忽略掉最后的语句classmethod(foo)&#xff0c…

Win10之解决:设置静态IP后,为什么自动获取动态IP问题(七十八)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

域内密码喷洒 Password Spray 实验

password spray 1. 实验网络拓扑 kali: 192.168.72.128win2008: 192.168.135.129 192.168.72.139win7: 192.168.72.149win2012:(DC) 192.168.72.131 2. 简单原理 Kerberos针对同一个用户&#xff0c;多次的密码尝试请求有锁定保护策略。 但是我们可以切换用户&#xff0c;…

【Streamlit案例】制作销售数据可视化看板

目录 一、案例效果 二、数据分析 三、加载数据 四、网站前端 &#xff08;一&#xff09;网页标题和图标 &#xff08;二&#xff09;侧边栏和多选框 &#xff08;三&#xff09;主页面信息 ​&#xff08;四&#xff09;主页面图表 &#xff08;五&#xff09;隐藏部…

基于四种网络结构的WISDM数据集仿真及对比:Resnet、LSTM、Shufflenet及CNN

在上节中&#xff0c;我们已经详细介绍了WISDM数据集及如何使用CNN网络训练&#xff0c;得到了六个维度的模型仿真指标及五个维度的可视化分析&#xff0c;那么现在我们将训练模型推广到其他网路结构中去&#xff0c;通过仿真实验来对比一下不同网络之间对于WISDM数据集的训练效…

【docker笔记8-镜像推送】

docker笔记8-镜像推送 一、基本命令二、案例1.Java demo2.打包镜像 一、基本命令 &#xff08;1&#xff09;推送镜像到远程仓库 docker tag local-image:tagname new-repo:tagname docker push new-repo:tagname这里首先要登录到docker&#xff0c;然后需要输入登录用户名和…

构建electron项目

1. 使用electron-vite构建工具 官网链接 安装构建工具 pnpm i electron-vite -g创建electron-vite项目 pnpm create quick-start/electron安装所有依赖 pnpm i其他 pnpm -D add sass scss1. 启动项目 2. 配置 package.json "dev": "electron-vite dev --…

【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错

1. 运行项目 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Appl…

Chromium 修改UA的几种办法方法c++

第一种方式 启动浏览器添加命令行 格式 --user-agent"自定义的UA" 1、C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe --user-agent"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome…

vgg19提取特征

一般来说&#xff0c;大家使用VGG16&#xff0c;用的是第四列的网络架构&#xff0c;而使用VGG19&#xff0c;使用的就是第六列的网络架构。 使用vgg进行提取特征&#xff0c;在这个项目中&#xff0c;使用的就是每一块卷积层的第一层。 import torch.nn as nn from torchvis…

T10:数据增强

T10周&#xff1a;数据增强 **一、前期工作**1.设置GPU,导入库2.加载数据 **二、数据增强****三、增强方式**方法一&#xff1a;将其嵌入model中方法二&#xff1a;在Dataset数据集中进行数据增强 **四、训练模型****五、自定义增强函数****六、总结** &#x1f368; 本文为&am…

idea使用ant源码运行tomcat8.5

1 安装ant 下载ant 下载地址 使用apache-ant-1.10.15版本 将压缩包放到/Library/Java/ant解压 设置ant环境变量 打开finder到用户根目录 按下shiftcmd.显示隐藏文件 打开隐藏文件.zprofile 按照以下格式设置环境变量 #ant export ANT_HOME/Library/Java/ant/apache-a…

数据丢失怎么办?2024四款恢复工具帮你忙!

数据是我们日常生活和工作中不可或缺的一部分&#xff0c;然而&#xff0c;由于误操作、硬件故障或其他原因导致的数据丢失却是常有的事情。这时候&#xff0c;一款可靠的数据恢复工具就显得尤为重要。 福昕数据恢复 直达链接&#xff1a;www.pdf365.cn/foxit-restore/ 假设…

Linux命令:用于显示 Linux 发行版信息的命令行工具lsb_release详解

目录 一、概述 二、用法 1、基本用法 2、选项 3、获取帮助 三、示例 1. 显示所有信息 2. 只显示发行版名称 3. 只显示发行版版本号 4. 只显示发行版代号 5. 只显示发行版描述 6. 只显示值&#xff0c;不显示标签 四、使用场景 1、自动化脚本 2、诊断问题 3、环…

【KVM】虚拟化技术及实战

一&#xff0c;KVM简介 KVM全称为QEMU-KVM。 KVM可以模拟内存&#xff0c;cpu的虚拟化&#xff0c;不能模拟其他设备虚拟化。 QEMU可以模拟I/O设备&#xff08;网卡&#xff0c;磁盘等&#xff09; 两者结合&#xff0c;实现真正意义上的虚拟化。 从rhel6版本开始&#xff0c…

Elasticsearch——数据聚合、数据同步与集群搭建

目录 1.数据聚合1.1.聚合的种类1.2.DSL实现聚合1.2.1.Bucket 聚合语法1.2.2.聚合结果排序1.2.3.限定聚合范围1.2.4.Metric 聚合语法1.2.5.小结 1.3.RestAPI 实现聚合1.3.1.API 语法1.3.2.业务需求1.3.3.业务实现 2.自动补全2.1.拼音分词器2.2.自定义分词器2.3.自动补全查询2.4.…

YOLOv8 结合设计硬件感知神经网络设计的高效 Repvgg的ConvNet 网络结构 ,改进EfficientRep结构

一、理论部分 摘要—我们提出了一种硬件高效的卷积神经网络架构,它具有类似 repvgg 的架构。Flops 或参数是评估网络效率的传统指标,这些网络对硬件(包括计算能力和内存带宽)不敏感。因此,如何设计神经网络以有效利用硬件的计算能力和内存带宽是一个关键问题。本文提出了一…

Chromium 使用安全 DNS功能源码分析c++

一、选项页安全dns选项如下图&#xff1a; 二、那么如何自定义安全dns功能呢&#xff1f; 1、先看前端部分代码调用 shared.rollup.jsclass PrivacyPageBrowserProxyImpl {.................................................................getSecureDnsResolverList() {re…

25货拉拉校园招聘面试经验 面试最常见问题总结

货拉拉校园招聘面试经验 目录 【面试经历】 问题+详细答案 面试全流程 【面试经历】 发面经,攒人品。 项目问题: 1.AOP日志落库到数据库,为什么不用一些现成的方案? 2.邀请链接的id怎么用redis生成的? 3.乐观锁保证了奖励的正确发放,请你说说乐观锁的原理。 4.奖…

TCN模型实现电力数据预测

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色&a…