news 2026/7/31 4:06:38

C语言(1)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言(1)

计算机基础

计算机的组成
计算机的定义

计算机:能进行计算及逻辑处理的设备。

硬件:组成计算机的物理部件(硬盘,内存条,CPU等)

​ 开发中对于硬件的认知:硬件包括电子设备、单片机、集成电路和嵌入式系统。

软件:计算机中运行的程序和数据

​ 开发中对于软件的认知:软件分为系统软件(OS)、应用软件、编程工具(编译器)

计算机的六大部件

中央处理器(CPU):负责控制指令执行和数据计算。

内存:临时存储程序运行时的指令和数据。

输入设备:向计算机输入数据(鼠标,键盘,扫码枪等)。

输出设备:将计算机处理结果输出(显示器,打印机等)。

外存设备:永久存储数据(硬盘,U盘等)。

网络:实现设备间数据的传输和通讯。

计算机工作原理

存储程序:程序和数据预先存储在内存里。

程序控制:CPU按照指令顺序逐条执行操作。

计算机工作语言
语言类型特点示例
机器语言二进制代码,可直接控制硬件,执行效率最高1011110 010100010
汇编语言用助记符表示机器指令,需通过汇编器翻译为机器语言MOV AL, 61h0、
高级语言贴近人类自然语言,可读性强,需要编译/解释执行printf(“hello world”)

C语言程序的开发过程

开发的三个步骤

①编辑:程序员编写源程序 .c文件。

②编译:编译器将源代码转换为可执行的二进制指令文件。

③运行:操作系统加载并执行可执行二进制程序。

C语言程序的编译过程

上面提到编译分为四个步骤:

预处理

预处理:软件分为系统软件(OS)、应用软件、编程工具(编译器):处理宏定义(#define),头文件包含(#include)、注释等,将头文件内容直接拷贝到当前文件。预处理需要用到预处理器。

命令:gcc -E *.c -o *.i

文件类型转换:*.c → *.i

说明:生成预处理后的C代码(文本文件)

yueqian@yueqian-vm:~$ gcc-Edeom1.c-odeom1.i yueqian@yueqian-vm:~$catdeom1.i
编译

编译:对预处理后的代码进行语法分析,语义检查,生成汇编语言代码。编译要用到编译器。

命令:gcc -S *.c -o *.s

文件类型转换:.i/.c → *.s

说明:生成汇编代码(文本文件)

yueqian@yueqian-vm:~$ gcc-Sdeom1.i-odeom1.s yueqian@yueqian-vm:~$catdeom1.s
汇编

.汇编:将汇编代码转换为二进制代码,生成目标文件。汇编要用到汇编器。

命令:gcc -c *.s -o *.o

文件类型转换:*.s → *.o

说明:将汇编代码转为二进制目标文件(注:gcc -c *.c 等价于预处理+编译+汇编三步)

yueqian@yueqian-vm:~$ gcc-cdeom1.s-odeom1.o yueqian@yueqian-vm:~$catdeom1.o
链接

链接:将目标文件与系统库文件、其他目标文件合并,生成可执行文件。链接要用到链接器。

命令:gcc *.c -o *

文件类型转换:*.o →可执行文件

说明:生成可执行二进制文件

C语言程序的基本结构

一个简单的C语言程序

功能:在控制台(终端)输出“Hello World!”

/************************************************************************* > File Name: deom1.c > Author: 蒋文辉 > Description: > Created Time: 2026年07月28日 星期二 19时34分38秒 ************************************************************************/#include<stdio.h>//引入输入输出标准库头文件,printf()需要这个头文件//主函数:一个*.c有且仅有1个主函数,作为程序的入口,这个函数在程序运行后自动执行intmain(intargc,char*argv[]){//C标准库提供的函数:向控制台输出Hello World,\n是换行的意思,需要引用<stdio.h>printf("Hello World\n");return0;}
#运行结果yueqian@yueqian-vm:~$ ./a.out Hello World
程序结构分析

①注释:用于解释代码逻辑,仅给程序员阅读。注释在编译的早期翻译阶段(预处理)被替换为空格,不参与后续编译。

②预处理指令:以 # 开头,用于包含头文件、宏定义等,如 #include <stdio.h> , #define PI 3.1415926。

③主函数( main 函数):程序的唯一入口,由操作系统通过程序启动机制自动调用,不能被程序员自定义函数调用。

④函数组成:

​ – 函数头:说明函数的返回值类型、函数名和参数列表。在C语言中, int main(void) 明确表示无参数,int main() 表示参数未指定(与C++不同,C中二者语义有区别)。若无参数,建议统一使用 intmain(void) 或 int main(int argc, char *argv[])

​ – 函数体:用 {} 括起来,包含变量声明和语句执行的部分(语句以 ; 结尾)

⑤函数调用语句:调用已定义的函数(如: printf ,是标准库中的输出函数)

C语⾔编程规范

C语言编程需要遵循以下规范,提升代码的可读性和可维护性

缩进格式

推荐缩进4个空格(或配置编辑器将Tab键显示宽度设为4个字符),统一代码层级。

⾜够注释

对于关键代码(如函数功能、复杂逻辑、变量含义)添加注释。

合适空⾏

预处理指令与函数之间、函数与函数之间、全局变量与函数之间添加空行,区分代码模块:

/************************************************************************* > File Name: deom1.c > Author: 蒋文辉 > Description: > Created Time: 2026年07月28日 星期二 20时10分45秒 ************************************************************************/// 包含头文件,预处理时,会将对应的.h文件代码全部拷贝到当前文件位置#include<stdio.h>#include<stdlib.h>// 宏定义:预处理阶段,会使用宏值替换掉宏名称,称作宏展开#defineR2// 定义一个半径#definePI3.1415926intmain(intargc,char*argv[]){//向控制台输出Hello Worldprintf("Hello World\n");// 计算圆的面积doublearea=PI*R*R;// 预处理后:double area = 3.1415926 * 2 * 2printf("%lf\n",area);return0;}
#运行结果yueqian@yueqian-vm:~$ ./a.out Hello World12.566370
{}对⻬

推荐(C/C++风格)

intfun(){...}
分层缩进与模块化

函数体内的代码按逻辑层次缩进,复杂逻辑拆分模块化:

intfunc(){if(..){for(..){printf("hello\n");}}if(..){for(..){printf("hello\n");}}}
单句单⾏

不将多条语句写在同一行

intmain(){// 不推荐的写法printf("第1行\n");printf("第2行\n");printf("第3行\n");// 推荐的写法printf("第1行\n");printf("第2行\n");printf("第3行\n");}
标识符命名

函数名、变量名等都叫标识符,命名要见名知意,使用英文单词或短语,避免无意义的字母

intmain(){// 不推荐的写法inta=21;intb=168;intc=190;// 推荐的写法intage=21;// 年龄:21intheight=168;// 身高:168intweight=190;// 体重:190return0;}

C语⾔中的注释

C语言注释分为单行注释和多行注释,作用是解释代码、屏蔽临时无用代码、不参与编译(在预处理阶段删除)。

单⾏注释

格式:用 // 开头,注释从 // 到行尾

适用场景:变量说明、常量说明、函数调用语句、简单逻辑注释

// 注释内容// 预处理指令:引入系统标准输入输出库(printf函数需要用到)#include<stdio.h>intmain(){// 向控制台输出 hello world! \n是换行符,必须写在 "\n" 内部printf("hello world!\n");return0;}
多⾏注释

格式:用 /* 开头,以 */ 结尾,可单行,可跨多行,不能嵌套

适用场景:文件头说明、函数功能说明、复杂代码块注释

/* 注释内容 *//* 注释内容 注释内容 *//* 函数名:main 功能:程序入口,输出hello world! 返回值:0-表示程序正常结束 */intmain(){...}
⽂档注释

文档注释本质上还是多行注释,用于生成标准化文档,格式更加规范,一般替代传统的多行注释。

/** * @brief 函数名:main * @author 开发者姓名 * @date 开发时间 * @param argc 解释参数 * @param argv 解释参数 * @return 返回值说明 */intmain(intargc,char*argv[]){...return0;}

数据类型

数据类型决定了数据在内存中如何存储?需要多大空间?

数据:计算机需要处理的信息(数字、文字、符号、图片、音视频等),程序运行时所有数据都需要加载到内存中。

数据类型分类
基本类型(内置类型)

​ – 整型(数值类型,存储整数)

短整型: short ( short int 的表示),2个字节

基本型: int (使用频率最高),4个字节

长整型: long ( long int 的表示),32位系统4字节,64位系统8字节

​ 长长整型: long long ( long long int ,C99新增标准)

​ – 浮点型(数值类型,存储小数/实数)

单精度型: float ,4个字节

双精度型: double ,8个字节

​ 长双精度型: long double

​ – 字符型: char (存储单个字符,本质是ASCII码值),1个字节

构造类型(用户基于C语言语法定义)
指针类型(存储内存地址)
空类型

void (表示无类型,用于函数返回值,函数形参,指针类型),举例: main(void) 等价于 main()

数据类型在内存中的大小
数据类型中文说明大小(字节)常见取值范围
short短整型2-32768~32767
int基本整型4-2147483648 ~ 2147483647
long长整型4(32位系统)/8(64位系统)32位:同int;Linux 64位:-9223372036854775808 ~9223372036854775807;Windows 64位:同32位(-2147483648 ~ 2147483647)
long long长长整型8-9223372036854775808 ~ 9223372036854775807
float单精度浮点型4约 ±3.4×10³⁸(精度 6~7 位有效数字)
double双精度浮点型8约 ±1.7×10³⁰⁸(精度 15~16 位有效数字)
char字符型1-128 ~ 127(有符号)/ 0 ~ 255(无符号)
bool(_Bool,C99新增)布尔型1true(非 0)、false(0)

注意: 计算机存储最小单位是 bit (位),1个 bit 仅能存储0或1;程序中最小操作单位是 Byte (字

节),1字节 = 8位;C语言中没有 Byte 这个单位,我们使用 char 表示字节。也就是 1 char =

8 bit 。

sizeof运算符使用示例

sizeof运算符,用来计算数据类型或者变量的大小,返回的是字节数

/************************************************************************* > File Name: demo01.c > Author: 蒋文辉 > Description: > Created Time: 2026年07月29日 星期二 17时25分31秒 ************************************************************************/#include<stdio.h>intmain(intargc,char*argv[]){printf("int的大小=%ld字节\n",sizeof(int));printf("double的大小=%ld字节\n",sizeof(double));return0;}
#运行结果int的大小=4字节 double的大小=8字节

总结:

① 数据类型的字节大小与C语言编译系统(32位/64位)、操作系统相关;

sizeof是运算符(非函数),计算结果为无符号整数(只有正整数,没有负整数);

常量

常量是程序执行过程中值不可改变的量,与变量一样需要用到内存空间存储。

整型常量

整型常量有十进制、八进制、十六进制三种表示形式;

表示形式
十进制常量

​ – 组成:数字0~9,不能以0开头,0自身除外

​ – 注意:不能表示小数

​ – 示例:正确写法:992980

​ 错误写法:06000

八进制常量

​ – 组成:数字0~7,以0为前缀(不可省略)

​ – 注意:不能表示小数

​ – 示例:正确写法:03062000

​ 错误写法:039,255

十六进制常量

​ – 组成: 0~9 + a~f / A~F ,以 0x/0X 为前缀

​ – 注意:不能表示小数

​ – 示例:0xFFAEFBF0X1230x0/0x00000000

后缀说明

长整型常量:在数值后加L/l,推荐用L

示例:long num = 123L明确指定为长整型,此时的 L 只起到一个标识作用,数值依然是123

有符号和无符号

有符号(默认):表示范围为负数 + 0 + 正数,如char的有效范围是-128~127,可以在类型前添加修饰关

键字signed,一般省略。

// 以下两行代码完全等价signedinta=10086;inta=10086;

无符号:表示范围 0 + 正数 (内存中负数位用来存储正数,正数范围更大),如 char 的无符号范围是

0~255,需要再类型前添加修饰关键字unsigned

unsignedcharnum=100;// 只能存储 0 ~ 255

char(有符号)范围:-128~127

char(无符号)范围:0~255

浮点型常量

浮点型常量(小数/实数)有两种表示方式:

十进制小数形式

组成:数字0~9,小数点 . ,必须包含小数点(即使整数部分为0或小数部分为0)

示例:0.123(double,默认) /0.123F(float)、-12.63.00.0

注意:

​ – float 类型常量需要在末尾添加F/f,默认浮点型常量为 double 类型。

​ – 示例:float f = 0.12F(明确指定为单精度浮点型)

指数形式(科学计数法)

格式:数字 e/E整数指数e/E表示10的幂次。

示例:

​ – 正数: 12345.67→1.234567*10^4→1.23467e+4或1.234567e4(十进制小数形式 → 指数形式)

– 负数: 0.0147→1.47*10^2→1.47e-2(十进制小数形式 → 指数形式)

注意:

​ – e/E 前面必须有数字( 0~9 ),其中小数点前的整数部分取值范围为 1~9 (前导零 0 在数值上无意义,但C语法允许)

​ – e/E 后面必须是整数(不能带小数),错误示例: 1.2345e3.5

​ – 单精度常量需要加 f/F ,如 1.2345e3F (float)、 1.2345e3 (double,默认)

字符型常量
普通字符常量

格式:用单引号 ‘’ 括起来的单个字符。英文输入法下的字母、数字、符号等ASCII规范的字符。

示例:

​ – 正确示例:如 ‘a’ , ‘A’ , ‘5’ , ‘_’ , ‘+’ , ‘\n’

​ – 错误示例:如 ‘软’ , “a”

本质:硬件存储的是ASCII规范的字符的ASCII码值,如 a 的ASCII码值为 97 , A 的ASCII码值为 65 ,数字为48

转义字符常量

以反斜杠 \ 开头的特殊的字符序列,用于表示控制字符或不可见字符(如换行符、制表符),常见转义符如下:

字符形式ASCII码中文解释用途
'\n'10换行光标移动至下一行开头
'\r'13回车光标移动至当前行开头
'\0'0空字符字符串结束标志(重要)
'\t'9水平制表符相当于按Tab键(8个空格)
'\\'92反斜杠表示字符\
'\''39单引号表示字符'
'\"'34双引号表示字符"

在 Linux 终端输入 man ascii 可查看所有 ASCII 字符及对应码值。

字符串常量
定义

用双引号""括起来的字符序列(可包含多个字符、数字、符号),C语言无内置的字符串类型,字符串常量和变量均需要通过字符数组或者字符指针来实现。字符串常量末尾自动添加\0结束标记,但是这个标志是看不见的,也不会显示输出。

示例
"How are you ? "// 实际存储:How are you ? \0"hello world"// 实际存储:hello world\0"123456"// 实际存储:123456\0""// 实际存储:\0
输出

通过printf函数的%s格式输出:

printf("hello world!\n");// 推荐,内部补充%s// 等价于printf("%s","hello world!\n");
与字符常量的区别
对比项字符常量(如:‘a’)字符串常量(如:“a”)
定界符单引号''双引号""
内存占用1字节(存储ASCII码)2字节('a' + '\0'
结束标志自动添加\0,字符串结束标志
表示范围仅单个字符可多个字符或空

关键:字符串常量末尾会被系统自动添加\0,用于标识字符串结束,这是字符串与字符常量的核心区别。

符号常量(无参宏定义)

定义

通过预处理指令#define定义的标识符,用于代表一个固定常量(预处理阶段,会直接替换成宏值)

优点

增强代码的可读性(用有意义的标识符代替魔法数字)

提升代码的可维护性(需修改常量时,仅需要修改宏定义,无需逐个修改代码)

语法格式
#define宏名称 宏值
注意事项

① 宏名称与宏值之间用空格隔开;

② 行末不能加;(否则替换是会带入分号,导致语法错误)

③ 宏名称命名规范:字母(A~Za~z)+ 数字(0~9)+ 下划线(_,不能以数字开头。习惯上宏名使用全大写(如MAX_VALUE),小写字母也合法但较少用于宏(如max_value

示例代码

源程序:

/************************************************************************* > File Name: demo03.c > Author: 蒋文辉 > Description: > Created Time: 2026年07月29日 星期二 19时01分30秒 ************************************************************************/#include<stdio.h>// 定义PI// 语法:#define 全大写宏名 宏值#definePI3.1415926intmain(intargc,char*argv[]){// 实现一个圆的面积计算// 创建一个变量,用来存放圆的半径doubler=10;// 计算圆的面积doublearea=PI*r*r;printf("圆的面积是:%f\n",area);// 计算圆的周长doublec=2*PI*r;printf("圆的周长是:%f\n",c);return0;}

预处理后:

...#14"demo03.c"intmain(intargc,char*argv[]){doubler=10;doublearea=3.1415926*r*r;printf("圆的面积是:%f\n",area);doublec=2*3.1415926*r;printf("圆的周长是:%f\n",c);return0;}

运行结果:

yueqian@st-vm:/mnt/hgfs/Code/20260729$ gcc demo03.c yueqian@st-vm:/mnt/hgfs/Code/20260729$ ./a.out 圆的面积是:314.159260 圆的周长是:62.831852
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/31 4:03:32

Python自动化获取怀俄明大学探空数据:从网络请求到结构化处理

1. 项目概述&#xff1a;从手动到自动的气象数据获取革命如果你也曾经为了分析某个特定区域的大气垂直结构&#xff0c;而不得不一遍遍手动点击怀俄明大学探空数据网站的下载按钮&#xff0c;那么你一定能理解这个项目的价值所在。怀俄明大学大气科学系维护的探空数据存档网站&…

作者头像 李华
网站建设 2026/7/31 4:02:50

Java对象比较:==、equals()与hashCode()详解

1. 从对象比较的困境说起第一次用Java写业务逻辑时&#xff0c;我遇到过这样一个场景&#xff1a;需要判断用户提交的表单数据是否已存在于系统缓存中。当时直接用了进行比较&#xff0c;结果明明内容相同的对象却被判定为"不相同"。这个坑让我花了整个下午调试&…

作者头像 李华
网站建设 2026/7/31 3:59:46

蓝桥杯嵌入式竞赛:数码管驱动原理与74HC595实战应用

1. 项目概述&#xff1a;为什么数码管是嵌入式竞赛的“基本功”&#xff1f;在蓝桥杯嵌入式竞赛的赛场上&#xff0c;数码管绝对是一个绕不开的“老朋友”。无论是作为显示计时器、计数器&#xff0c;还是展示传感器数据&#xff0c;它都是人机交互最直观、最基础的窗口。很多新…

作者头像 李华
网站建设 2026/7/31 3:59:08

ADB事件模拟实战:从基础命令到自动化脚本编写

1. ADB事件模拟&#xff1a;从基础命令到实战脚本如果你正在和安卓设备打交道&#xff0c;无论是做自动化测试、批量操作&#xff0c;还是远程控制&#xff0c;ADB&#xff08;Android Debug Bridge&#xff09;绝对是你绕不开的瑞士军刀。它最核心的魅力之一&#xff0c;就是能…

作者头像 李华
网站建设 2026/7/31 3:56:21

OpenClaw安装方法2026,最简单的部署方式推荐

折腾了半天才发现&#xff0c;OpenClaw安装其实没那么玄乎 说实话&#xff0c;我第一次接触OpenClaw的时候&#xff0c;真的被各路教程给整懵了。有的说要配复杂的环境变量&#xff0c;有的要改Nginx配置&#xff0c;还有的动不动就让你编译源码……我电脑小白一个&#xff0c…

作者头像 李华
网站建设 2026/7/31 3:56:01

UFS功耗管理实战:从状态机原理到Linux内核配置与避坑指南

1. 从一次深夜告警说起&#xff1a;为什么UFS功耗管理不是“小事”凌晨两点&#xff0c;手机突然震动&#xff0c;一条来自监控系统的告警信息弹了出来&#xff1a;“设备A-03&#xff0c;电池续航异常下降&#xff0c;预计剩余使用时间不足8小时。” 我揉了揉眼睛&#xff0c;…

作者头像 李华