本章学习C语言的运行机制、常见的库文件、代码框架、标识符的命名规则、C语言关键字、常量学习、输入输出函数、局部变量与全局变量一、C语言运行机制整个过程编写.C文件、编译成.obj的二进制机器指令、结合C语言的库文件链接形成可执行的二进制.exe、最终运行输出结果。C语言常见的库文件有头文件常用函数 / 内容高频考点stdio.hprintf、scanf、fopen、fread、fwrite输入输出、文件操作string.hstrlen、strcpy、strncpy、memcpy、memset、strcmpstrcpy 与 memcpy 区别、越界风险stdlib.hmalloc、calloc、realloc、free、atoi、exit、qsort、bsearchmalloc 底层、内存泄漏math.hsqrt、pow、sin、abs需链接-lm编译时记得加 -lmctype.hisdigit、isalpha、toupper、tolower字符分类time.htime、clock、gettimeofdayPOSIX计时、时间戳assert.hassert()调试断言errno.herrno、perror、strerror错误码处理stdarg.hva_list、va_start、va_end可变参数实现stdint.hint8_t、uint16_t、int32_t嵌入式必考定长整型跨平台 / 跨 MCU 可移植stdbool.htrue、falseC99 后可用布尔类型limits.hINT_MAX、CHAR_BIT 等各类型取值范围stddef.hNULL、size_t、ptrdiff_t、offsetof常见宏定义setjmp.hsetjmp、longjmp异常跳转低层基本的代码框架#includestdio.h //C语言的编译头文件库 int main() //每一个程序(或工程)可以定义很多函数(后面讲)但有且只有一个main()函数作为程序执行的入口空括号()表示 main 不接受任何参数。 //写在main之前的“int”称为关键字代表数据类型是整型。它是main()的返回值类型。即在执行main()函数后会得到一个整型值无返回值可定义void类型 { return 0;//int数据类型下不能省略 }注意(1)其中一对花括号{}定义了函数的主体所有函数都必须以大括号开头和结尾成对出现。(2)每一个执行语句后面都会有一个英文分号“;”作为语句结束的标志。C语言的输出格式printf()printf()函数是产生格式化输出的函数作用是将参数文本输出到屏 幕。它名字里面的 f代表format (格式化)表示可以指定输出文本的格式。printf()是在标准库的头文件stdio.h中定义的。要想在程序中使用这个函数必须在源文件头部引入这个头文件。其中占位符的第一个字符是%第二个字符表示占位符的类型。printf()的占位符有许多种类与C语言的数据类型相对应。其中常见的类型输出格式为int(%d)、char(%c)、float(%f)、八进制整数(%o)、十六进制(%x)、String字符串(%s)、科学技术法(%e)等等二、C语言的变量命名规则C语言中变量、函数、数组名、结构体等要素命名时使用的字符序列称为标识符标识符组成由字母、数字、下划线_但是命名规则必须是字母或者下划线_为开头变量名不能有空格且不能为关键字(下面会讲);其中长度也有限制C89标准规定标识符长度不得超过31个字符。C99标准规定标识符长度不得超过63个字符。注标识符如果超出编译器所支持的标准就会忽略后续的字符长度传统的C语言常见关键字有32个C语言常见关键字类型具体关键字控制语句关键字12个break, case, continue, default, do, else, for, goto,if, return, switch, while数据类型关键字12个char, enum, double, long, float, int, short,signed, struct, unsigned, union, void存储类型关键字4个auto, extern, register, static其他关键字(4 个const, sizeof, typedef, volatile后续1999年C99标准增加了5个关键字inline 、 restrict 、 _Bool 、 _Complex 和 _Imaginary 。 2011年C11标准又增加了7个关键字 _Alignas 、 _Alignof 、 _Atomic 、 _Static_assert 、 _Noreturn 、 _Thread_local 和 _Generic 。其中C语言的变量名的命名最好是有意义的定义这有助于代码的可读性和维护性2.1 变量的的作用变量是程序中不可或缺的组成单位最基本的存储单元一个变量就是一个存储单元就会分配存储空间变量的定义一般按照以下的格式进行数据类型变量名;//声明变量的语句必须以分号结尾、举例int lengthchar IDC语言常见的数据类型如下所示//基本数据类型【整型、浮点型、字符型】 整型int、短整型short int、长整型long int 浮点型可分为单精度型float、双精度型double 字符型单字节char、字符串则用字符数组表示 //构造类型 数组类型、结构体类型struct、共用体类型union、枚举类型enum //空类型 void //指针类型 *三、C语言的常量常量在程序运行过程中其值不能被修改是 C 语言中最基础的数据形式之一。按照书写形式和使用方式常见的常量可以分为以下几类。3.1 字面常量直接常量直接写在代码中的具体数值或字符不需要额外定义即可使用。整型常量如100、-25、0。可以写成十进制、八进制以0开头如0755或十六进制以0x开头如0xFF。实型浮点常量如3.14、-0.5也支持科学计数法1.2e3即 1200.0。默认是double类型加后缀f表示float如3.14f。字符常量用单引号括起来的单个字符如A、9、\n。字符常量在内存中存储的是其 ASCII 码值因此A等价于65。字符串常量用双引号括起来的字符序列如hello、C语言。字符串末尾会自动添加结束符\0所以abc实际占用 4 个字节。3.2 转义字符常量以反斜杠\开头的特殊字符用于表示无法直接输入的字符。转义字符含义\n换行\t水平制表符Tab\\反斜杠本身\单引号\双引号\0空字符字符串结束标志\ddd三位八进制数表示的字符如\101表示A\xhh十六进制数表示的字符如\x41表示A3.3 宏常量符号常量使用#define预处理指令定义的常量在编译前由预处理器进行文本替换,就是用一个标识符来表示一个常量值。宏名用大写字母表示以便于与变量区别;格式#define符号常量名 常量值#include stdio.h #define PI 3.14159 #define MAX_SIZE 100 int main(void) { double r 2.0; printf(面积 %f\n, PI * r * r); printf(最大容量 %d\n, MAX_SIZE); return 0; }注意跟#include一样“#”开头的语句都是“预处理语句”在编译之 前预处理器会查找程序中所有的“PI ”并把它替换成3.14159这 个过程称为预编译处理。宏常量只是简单的文本替换没有类型检查因此建议在定义时加上括号避免运算优先级问题例如#define SQUARE(x) ((x) * (x))。3.4 const 修饰的常量C99中新的声明方式这种方式跟定义一个变量是一样的只需要在变量的数据类型前再加上一个const关键字这被称为“限定符”。使用const关键字修饰的变量其值在初始化后不能被修改具有类型检查是更推荐的常量定义方式。格式const数据类型 常量名常量值;#include stdio.h int main(void) { const double PI 3.14159; const int MAX_SIZE 100; printf(PI %f\n, PI); printf(MAX_SIZE %d\n, MAX_SIZE); // PI 3.14; // 编译错误const 变量不能被修改 return 0; }const常量与宏常量的区别const常量有数据类型编译器会进行类型检查宏常量只是文本替换。const常量在调试时可以看到变量名和值宏常量在预处理后已不存在。const常量占用内存可能被优化宏常量不占用内存。3.5 枚举常量使用enum关键字定义的一组有名字的整型常量适合表示一组相关的状态或选项。#include stdio.h enum Weekday { MON 1, TUE, WED, THU, FRI, SAT, SUN }; int main(void) { enum Weekday today WED; printf(today %d\n, today); // 输出 3 return 0; }枚举常量的值默认从 0 开始依次递增也可以手动指定初始值后续未指定的成员会在此基础上继续递增。3.6 常见常量对比常量类型定义方式特点字面常量100、3.14、A直接书写无需定义宏常量#define PI 3.14预处理替换无类型检查const 常量const int N 10;有类型检查推荐使用枚举常量enum Color { RED, GREEN };一组相关的整型常量小结在实际开发中对于简单的数值常量优先使用const定义既能保证类型安全又便于调试对于需要表示一组相关状态的场景使用enum更加清晰宏常量则多用于条件编译或需要跨文件共享的配置项。四、C语言的输入输出所谓输入输出是以计算机主机为主体而言的。输出从计算外部输出设备(显示器、打印机)输出数据。输入从输入设备(键盘、鼠标、扫描仪)向计算机输入数据。C语言本身没有提供专门的输入输出语句所有的输入输出都是由调用标准库函数中的输入输出函数来实现的。常用的输入输出函数如下所示输入函数scanf() 、 getchar()、gets()scanf()是格式输入函数可接收任意类型的数据。getchar()是字符输入函数 只能接收单个字符。gets()是字符串输入函数。输出函数printf() 、 putchar()、puts()printf()是格式输出函数可按指定的格式显示任意类型的数据。putchar()字符显示函数只能显示单个字符。puts()是字符串输出函数。4.1 scanf()的使用scanf()函数的作用把从键盘上输入的数据根据找到的地址存入内存中即给变量赋值。格式为scanf(格式控制字符串,参数地址列表);格式控制字符串约定输入数据的类型和格式参数的个数必须与变量地址的个数一致。参数地址列表以逗号 “, ”分隔的、输入数据变量地址序列。例如scanf(%d%d%d,a,b,c)%d表示类型的输出格式、表示取地址符号注意如果scanf中%d是连着写的如“%d%d%d”在输入数据时数据之间不可以用逗号分隔只能用空白字符(空格或tab键或者回车键)分隔。即“2(空格)3(tab)4” 或 “2(tab)3(回车)4”等。如果是“%d,%d,%d”则在输入数据时需要加“,”逗号如“2,3,4”。4.2 getchar()、putchar()的使用getchar()输入字符数据格式getchar()功能从键盘缓冲区读入一个字符putchar()输出字符格式 putchar(ch)其中ch是一个字符变量功能从标准输出设备输出一个字符4.3 gets()与puts()的使用puts()在C语言中puts() 是一个用于输出字符串的标准库函数其原型定义在标准头文件中。puts() 函数的作用是将一个以 null 字符\0结尾的字符串打印到标准输出通常是控制台上并自动添加一个换行符。注意puts()函数只能用于输出字符串而不能输出其他类型的数据。如果需要输出其他类型的数据应使用 printf() 函数。gets()读取标准输入设备输入的字符串直到遇到【Enter】键才结束。补充也可以用printf()函数输出打印样例代码为#includestdio.h //puts头文件需要 int main() { char str[15]; printf(enter your name:); gets(str); //输入字符串至数组变量str printf(your name is ); puts(str); //输出字符串 printf(your name is %s\n,str); //输出字符串 return 0; }五、局部变量与全局变量变量按照声明的位置可以分为局部变量 和 全局变量。局部变量在函数体内{}定义的变量也称内部变量。局部变量只能在定义它的函数中使用。全局变量在函数之外{}定义的变量称为外部变量外部变量是全局变量也称全程变量。一个程序中凡是在全局变量之后定义的函数都可以使用在其之前定义的全局变量当局部变量和全局变量同名的时候局部变量优先使用。#include stdio.h int global 2026;//全局变量 int main(){ int local 2026;//局部变量 //下面定义的global会不会报错 int global 2026;//局部变量 printf(global %d\n, global); return 0; }总结本章初步了解了C语言的运行机制了解了C语言中变量的命名、输入输出函数。下一章节直接针对性学习C语言的结构可能减少部分原理性知识
企业数字化 ERP 产品动态
相关推荐
AI工具层出不穷,我开始怀疑到底需要什么? 今天刷抖音,又发现了几个让我眼前一亮的 AI 工具:蚂蚁的灵光、TapNow,以及室友分享的一个前端 Skill。AI 的迭代速度很快,而这些产品正在探索越来越多的可能性。与此同时,我也开始疑惑:面对层出不穷的 AI 工… · 2026/11/5 6:54:33
csdn_body /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 6:54:33
ADS122U04与STM32F410RB工业温度采集方案:UART接口ADC实战详解 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 7:35:44
ADS122U04IPWR + PIC18F66K40:PT100/NTC高精度温度采集方案解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 7:35:44
Figma设计稿转LVGL嵌入式UI:自动化链路与工程实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 7:35:44
ADS122U04IPWR+PIC18F56K42实现0.1℃工业温度测量 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 7:35:44
工业温度测量信号链设计:ADS122U04与PIC18F57Q43实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 7:35:44
1km人口分布栅格数据处理:口径、裁剪与时间序列分析 去年帮一位做城市扩张研究的朋友处理人口栅格,他拿到一份 2000—2023 年的 1km 精度人口分布栅格数据,第一件事就是把研究区内的像元值全部加总,想直接得到总人口曲线。结果算出来的数比公开统计口径少了将近三成,他一度以为是数据… · 2026/11/5 7:34:44
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38