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代码文本文件yueqianyueqian-vm:~$ gcc-Edeom1.c-odeom1.i yueqianyueqian-vm:~$catdeom1.i编译编译对预处理后的代码进行语法分析语义检查生成汇编语言代码。编译要用到编译器。命令gcc -S *.c -o *.s文件类型转换.i/.c → *.s说明生成汇编代码文本文件yueqianyueqian-vm:~$ gcc-Sdeom1.i-odeom1.s yueqianyueqian-vm:~$catdeom1.s汇编.汇编将汇编代码转换为二进制代码生成目标文件。汇编要用到汇编器。命令gcc -c *.s -o *.o文件类型转换*.s → *.o说明将汇编代码转为二进制目标文件注gcc -c *.c 等价于预处理编译汇编三步yueqianyueqian-vm:~$ gcc-cdeom1.s-odeom1.o yueqianyueqian-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秒 ************************************************************************/#includestdio.h//引入输入输出标准库头文件printf()需要这个头文件//主函数一个*.c有且仅有1个主函数作为程序的入口这个函数在程序运行后自动执行intmain(intargc,char*argv[]){//C标准库提供的函数向控制台输出Hello World\n是换行的意思需要引用stdio.hprintf(Hello World\n);return0;}#运行结果yueqianyueqian-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文件代码全部拷贝到当前文件位置#includestdio.h#includestdlib.h// 宏定义预处理阶段会使用宏值替换掉宏名称称作宏展开#defineR2// 定义一个半径#definePI3.1415926intmain(intargc,char*argv[]){//向控制台输出Hello Worldprintf(Hello World\n);// 计算圆的面积doubleareaPI*R*R;// 预处理后double area 3.1415926 * 2 * 2printf(%lf\n,area);return0;}#运行结果yueqianyueqian-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(){// 不推荐的写法inta21;intb168;intc190;// 推荐的写法intage21;// 年龄21intheight168;// 身高168intweight190;// 体重190return0;}C语⾔中的注释C语言注释分为单行注释和多行注释作用是解释代码、屏蔽临时无用代码、不参与编译在预处理阶段删除。单⾏注释格式用 // 开头注释从 // 到行尾适用场景变量说明、常量说明、函数调用语句、简单逻辑注释// 注释内容// 预处理指令引入系统标准输入输出库printf函数需要用到#includestdio.hintmain(){// 向控制台输出 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~32767int基本整型4-2147483648 ~ 2147483647long长整型432位系统/864位系统32位同intLinux 64位-9223372036854775808 ~9223372036854775807Windows 64位同32位-2147483648 ~ 2147483647long long长长整型8-9223372036854775808 ~ 9223372036854775807float单精度浮点型4约 ±3.4×10³⁸精度 6~7 位有效数字double双精度浮点型8约 ±1.7×10³⁰⁸精度 15~16 位有效数字char字符型1-128 ~ 127有符号/ 0 ~ 255无符号bool(_Bool,C99新增)布尔型1true非 0、false0注意 计算机存储最小单位是 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秒 ************************************************************************/#includestdio.hintmain(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 为前缀​ – 注意不能表示小数​ – 示例0xFFAEFBF、0X123、0x0/0x00000000后缀说明长整型常量在数值后加L/l推荐用L示例long num 123L明确指定为长整型此时的 L 只起到一个标识作用数值依然是123有符号和无符号有符号默认表示范围为负数 0 正数如char的有效范围是-128~127可以在类型前添加修饰关键字signed一般省略。// 以下两行代码完全等价signedinta10086;inta10086;无符号表示范围 0 正数 内存中负数位用来存储正数正数范围更大如 char 的无符号范围是0~255需要再类型前添加修饰关键字unsigned。unsignedcharnum100;// 只能存储 0 ~ 255char(有符号)范围-128~127char(无符号)范围0~255浮点型常量浮点型常量小数/实数有两种表示方式十进制小数形式组成数字0~9小数点 . 必须包含小数点即使整数部分为0或小数部分为0示例0.123(double默认) /0.123F(float)、-12.6、3.0、0.0注意​ – float 类型常量需要在末尾添加F/f默认浮点型常量为 double 类型。​ – 示例float f 0.12F明确指定为单精度浮点型指数形式科学计数法格式数字 e/E整数指数e/E表示10的幂次。示例​ – 正数 12345.67→1.234567*10^4→1.23467e4或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码中文解释用途\n10换行光标移动至下一行开头\r13回车光标移动至当前行开头\00空字符字符串结束标志重要\t9水平制表符相当于按Tab键8个空格\\92反斜杠表示字符\\39单引号表示字符\34双引号表示字符在 Linux 终端输入 man ascii 可查看所有 ASCII 字符及对应码值。字符串常量定义用双引号括起来的字符序列可包含多个字符、数字、符号,C语言无内置的字符串类型字符串常量和变量均需要通过字符数组或者字符指针来实现。字符串常量末尾自动添加\0结束标记但是这个标志是看不见的也不会显示输出。示例How are you ? // 实际存储How are you ? \0hello world// 实际存储hello world\0123456// 实际存储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秒 ************************************************************************/#includestdio.h// 定义PI// 语法#define 全大写宏名 宏值#definePI3.1415926intmain(intargc,char*argv[]){// 实现一个圆的面积计算// 创建一个变量用来存放圆的半径doubler10;// 计算圆的面积doubleareaPI*r*r;printf(圆的面积是%f\n,area);// 计算圆的周长doublec2*PI*r;printf(圆的周长是%f\n,c);return0;}预处理后...#14demo03.cintmain(intargc,char*argv[]){doubler10;doublearea3.1415926*r*r;printf(圆的面积是%f\n,area);doublec2*3.1415926*r;printf(圆的周长是%f\n,c);return0;}运行结果yueqianst-vm:/mnt/hgfs/Code/20260729$ gcc demo03.c yueqianst-vm:/mnt/hgfs/Code/20260729$ ./a.out 圆的面积是314.159260 圆的周长是62.831852

本月热点