《C语言程序设计》笔记* 潘建瑜 华东师范大学·数学科学学院 2023年3月3日 本笔记仅供课堂教学使用 https://math.ecnu.edu.cn/~jypan
《C 语言程序设计》笔记* 潘建瑜 华东师范大学 • 数学科学学院 2023 年 3 月 3 日 *本笔记仅供课堂教学使用 https://math.ecnu.edu.cn/~jypan
目录 第一讲编程基础 1.1C语言概述 111C语言源程序结构.································· 1 1.1.2C语言源程序书写规范 1.1.3 1.2C语言基础知识.... 1.21C语言字符集,标识符,关键字·。…·。· 1.2.2C语言数据类型 1.2.3 变量与常量 12.4运算与表达式.... 6 1.2.5常用数学函数 1.3C语言格式化输入输出 8 13.1C语言格式化输出..·· 8 1.3.2C语言格式化输入 9 第二讲选择与循环 10 2.1 关系运算与逻辑运算 10 2.2.1IF语句 6 2.2.2 SWITCH结构 23循环结构.·... 23.1WHLE循环. 。 2.3.2 DO WHILE循环 2.3.3 FOR循环 123 2.3.4循环的非正常终止 第三讲数组 li 3.1一维数组 3.2 二维数组。…………… 15 33字符串… 第四讲函数 8 4.1函数的声明、定义与调用 4.2作用域、局部变量与全局变量 21 4.4函数嵌套与递归 23 4.5内联函数 24 第五讲指针 5.1指针的定义与运算
目 录 第一讲 编程基础 1 1.1 C 语言概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.1 C 语言源程序结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.2 C 语言源程序书写规范 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.3 程序编译 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2 C 语言基础知识 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2.1 C 语言字符集, 标识符, 关键字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2.2 C 语言数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2.3 变量与常量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2.4 运算与表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.2.5 常用数学函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3 C 语言格式化输入输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3.1 C 语言格式化输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3.2 C 语言格式化输入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 第二讲 选择与循环 10 2.1 关系运算与逻辑运算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2 选择结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2.1 IF 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2.2 SWITCH 结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.3 循环结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3.1 WHILE 循环 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3.2 DO WHILE 循环 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3.3 FOR 循环 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.3.4 循环的非正常终止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 第三讲 数组 14 3.1 一维数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.2 二维数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.3 字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 第四讲 函数 18 4.1 函数的声明、定义与调用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 4.2 作用域、局部变量与全局变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 4.3 函数间的参数传递 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 4.4 函数嵌套与递归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 4.5 内联函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 第五讲 指针 25 5.1 指针的定义与运算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 ii
目录 。iiⅲ 5.2指针与一维数组 5.3指针与二维数组 5.4指针与函数. 29 5.5特久动态内存分配 5.6应用:矩阵乘积的快速算法 5.6.1 矩阵乘积的普通方法 5.6.2 Strassen万法. 5.7应用:Gauss消去法求解线性方程组 5.71Gaus消去过程 35 5.7.2 选主元Gauss消去法 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 58上机练习..,,..,., 第六讲文件读写操作 6.1文件的打开和关闭 38 6.2文本文件的读写 。。·。”。。·。。4,4。。。”。”。。。。。。””4。·。4 38 6.2.1 0 第七讲预编译处理与多文件结构 71预编译处理………… 72多文件结构 43 http://math.ecnu.edu.cn/-jypan
目 录 · iii · 5.2 指针与一维数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 5.3 指针与二维数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 5.4 指针与函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 5.5 持久动态内存分配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 5.6 应用: 矩阵乘积的快速算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 5.6.1 矩阵乘积的普通方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 5.6.2 Strassen 方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 5.7 应用: Gauss 消去法求解线性方程组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 5.7.1 Gauss 消去过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 5.7.2 选主元 Gauss 消去法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 5.8 上机练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 第六讲 文件读写操作 38 6.1 文件的打开和关闭 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 6.2 文本文件的读写 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 6.2.1 二进制文件的读写 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 6.2.2 其他文件操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 第七讲 预编译处理与多文件结构 42 7.1 预编译处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 7.2 多文件结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 7.3 编译选项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 http://math.ecnu.edu.cn/~jypan
第一讲编程基础 1.1C语言概述 C语言是一门广泛使用的面向过程高级编程设计语言,其语法丰富,且灵活高效,是当前高性能科 学计算和大型软件开发的常用编程语言. ·l972年,贝尔实验室D.Ritchie开发 ·1978年,B.Kernighan和D.Ritchie《C程序设计语言》,被称为K&R标准 。1989年,ANSI C标准形成C89,1990年ISO发布C90 ·1999,IS0正式发布新的标准C99,引入一些新特性,如内联函数 ·2011年,C11标准发布,添加许多新功能,同时修改C99库的某些部分为可选,提高与C+的兼 容性 ·2017年,发布C171C18,是当前标准,仅进行技术更正 1.1.1C语言源程序结构 1#include/预处理命令,载入头文件 int main()/l主函数 3{ 4 printf("Hello Math!\n");/标准输出 return 0; 6} 。一个C语言源程序由一个或多个源文件组成 ·每个源文件可由一个或多个函数组成: 。一个源程序有且只能有一个main函数,即主函数; ·程序执行从main开始,在main中结束; 。源程序中可以有预处理命令(以“#”开头),通常应放在源文件或源程序的最前面; 1.1.2c语言源程序书写规范 ·每条语句以分号“;”结尾,但预处理命令,函数头和右花括号“}”之后不需要加分号结构除外): ·标识符、关键字之间要有间隔,可以是空格或间隔符(如运算符、括号等): ·C语言区分大小写: 。注释符:/**/(整段注释,称为段注释符),当前的大部分C语言编译器也支持行注释符/1(单行 注释) ·一行可以写多个语句,一个语句也可以分几行书写; ·常用锯齿形书写格式. ·注意:所有标点符号必须在英文状态下输入! 业书写规范的程序建议: 。花括号{}要对齐: ·一行写一个语句,一个语句写一行;
第一讲 编程基础 1.1 C 语言概述 C 语言是一门广泛使用的面向过程高级编程设计语言, 其语法丰富, 且灵活高效, 是当前高性能科 学计算和大型软件开发的常用编程语言. • 1972 年,贝尔实验室 D. Ritchie 开发; • 1978 年,B. Kernighan 和 D. Ritchie《C 程序设计语言》,被称为 K&R 标准; • 1989 年,ANSI C 标准形成 C89,1990 年 ISO 发布 C90 • 1999,ISO 正式发布新的标准 C99,引入一些新特性,如内联函数 • 2011 年, C11 标准发布,添加许多新功能,同时修改 C99 库的某些部分为可选,提高与 C++ 的兼 容性 • 2017 年, 发布 C17/C18,是当前标准,仅进行技术更正 1.1.1 C 语言源程序结构 ✞ ☎ 1 #include // 预处理命令, 载入头文件 2 int main() // 主函数 3 { 4 printf("Hello Math!\n"); // 标准输出 5 return 0; 6 } ✝ ✆ • 一个 C 语言源程序由一个或多个源文件组成; • 每个源文件可由一个或多个函数组成; • 一个源程序有且只能有一个 main 函数, 即主函数; • 程序执行从 main 开始, 在 main 中结束; • 源程序中可以有预处理命令 (以“#”开头), 通常应放在源文件或源程序的最前面; 1.1.2 C 语言源程序书写规范 • 每条语句以分号“;”结尾, 但预处理命令, 函数头和右花括号“}”之后不需要加分号 (结构除外); • 标识符、关键字之间要有间隔, 可以是空格或间隔符 (如运算符、括号等); • C 语言区分大小写; • 注释符: /* */ (整段注释, 称为段注释符), 当前的大部分 C 语言编译器也支持行注释符 // (单行 注释) • 一行可以写多个语句, 一个语句也可以分几行书写; • 常用锯齿形书写格式. • 注意: 所有标点符号必须在英文状态下输入! K 书写规范的程序建议: • 花括号 { } 要对齐; • 一行写一个语句, 一个语句写一行; 1
2 第一讲编程基础 ·使用TAB编进,有合造的空行,提升程序的可读性; ·有足够的注释 1.1.3程序编译 ·编译器:将“高级语言”翻译为“机器语言”的工具 ·一个现代编译器的主要工作流程: 源代码_编译目标代码链接,可执行程序 ·常见的C/Ct+语言编译器:Visual C+,GNUC++,Intel C++,Clang C/C+等等 ·IDE(Integrated Development Environment集成开发环境):用于程序开发的应用软件,一般包括代码 编辑器、编译器、调试器和图形用户界面等,常用的DE有 ·Visual Studio:由微软开发,适用Windows平台,大而全,有社区版(免费),支持dlang ·DevC+:小巧,免费,Windows平台上的ge,非常适合学习CC+ ·Code:Blocks:开放源码的全功能跨平台集成开发环境,免费; ·Qt Creator:跨平台开发环境,为应用程序开发提供一站式解决方案 ·VS Code+MinGW:微软免费IDE+GCC(微软有配置方法指导) 12C语言基础知识 1.2.1C语言字符集,标识符,关键字 ·合法的字符集有 ()字母:包括大写和小写,共52个: (2)数字:0到9共10个: ()空白符:空格符、制表符、换行符: (④标点符号和特殊字符: +-*/=!#%&()[]{}-~<>八":;·,? ·C语言标识符:用来标识变量名、函数名、对象名等的字符序列. ()由字母、数字、下划线组成,第一个字符必须是字母或下划线 (2)区分大小写,不能用关键字; (3)C语言不限制标识符长度,实际长度与编译器有关,建议不要超过32个字符: (④命名原则:见名知意,不宜混淆 ·分隔符:逗号、冒号、分号、空格、()、{} ·注释符:段注释符,以“/*”开头并以“*”结尾,另外,当前大部分编译器也支持行注释符“/” ·C语言关键字:具有特定意义的字符串,也称为保留字,包括:类型标识符、语句定义符(控制命 令人预处理命令等 http://math.ecnu.edu.cn/-jypan
· 2 · 第一讲 编程基础 • 使用 TAB 缩进, 有合适的空行, 提升程序的可读性; • 有足够的注释. 1.1.3 程序编译 • 编译器: 将“高级语言”翻译为“机器语言”的工具; • 一个现代编译器的主要工作流程: 源代码 编译 −−−−−−→ 目标代码 链接 −−−−−−→ 可执行程序 • 常见的 C/C++ 语言编译器: Visual C++, GNU C++, Intel C++, Clang C/C++ 等等 • IDE (Integrated Development Environment 集成开发环境): 用于程序开发的应用软件,一般包括代码 编辑器、编译器、调试器和图形用户界面等, 常用的 IDE 有 • Visual Studio : 由微软开发, 适用 Windows 平台, 大而全,有社区版(免费),支持 clang. • Dev C++ : 小巧, 免费, Windows 平台上的 gcc, 非常适合学习 C/C++. • Code::Blocks : 开放源码的全功能跨平台集成开发环境, 免费; • Qt Creator : 跨平台开发环境,为应用程序开发提供一站式解决方案 • VS Code + MinGW : 微软免费 IDE + GCC (微软有配置方法指导) 1.2 C 语言基础知识 1.2.1 C 语言字符集, 标识符, 关键字 • 合法的字符集有 (1) 字母: 包括大写和小写, 共 52 个; (2) 数字: 0 到 9 共 10 个; (3) 空白符: 空格符、制表符、换行符; (4) 标点符号和特殊字符: + ‐ * / = ! # % ^ & ( ) [ ] { } _ ~ \ ' " : ; . , ? • C 语言标识符: 用来标识变量名、函数名、对象名等的字符序列. (1) 由字母、数字、下划线组成, 第一个字符必须是字母或下划线; (2) 区分大小写, 不能用关键字; (3) C 语言不限制标识符长度, 实际长度与编译器有关, 建议不要超过 32 个字符; (4) 命名原则: 见名知意, 不宜混淆. • 分隔符: 逗号、冒号、分号、空格、( )、{ } • 注释符: 段注释符, 以“/*”开头并以“*/”结尾, 另外, 当前大部分编译器也支持行注释符“//” • C 语言关键字: 具有特定意义的字符串, 也称为保留字, 包括: 类型标识符、语句定义符(控制命 令)、预处理命令等; http://math.ecnu.edu.cn/~jypan
1.2C语言基础知识 .3 表1.1.C语言关健字 auto break case char const(C90) continue default do double else enum(C90) extern float for goto if inline(C99)int long register restrict return short signed(C90) sizeof static struct switch typedef union unsigned void volatile (C90) while Alignas Alignof Bool _Complex_Generic _Imaginary _Noreturn _Static_assert #_Thread_local 1.2.2C语言数据类型 C语言的数据类型可分为基本数据类型和派生(扩展)数据类型。 ·基本数据类型:整型,实型,字符型(char)和布尔型(_Bool) (L)整型:int,short,long,unsigned int,unsigned short,unsigned long (2)实型:f1oat,doub1e 表1.2.C语言基本数据类型 数据类型|关键字 所占字节 」表示范围 整型 short 2 -215215-1 int 214 -215215-11-231231-1 long 418 -231~231-11-263263-1 unsigned short 2 |0~216-1 unsigned int 2/4 |0~216-1/0232-1 unsigned long 4/8 0~232-1/0~264-1 实型 float 4(6位有效数字)|10-38~1038 double 8(15位有效数字)10-308~10308 布尔型B0o1 1 0,1 字符型|char 凸注记:事实上,C语言标准没有规定年种数据类型的具体字节数和表示范国,只规定大小顺 序,即长度满足下面的关系式 char <short <int <long <long long 具体长度由编译器决定 ·派生(扩展、导出、自定义)数据类型:数组,指针,枚举,结构,联合,复数,等等 http://math.ecnu.edu.cn/-jypan(
1.2 C 语言基础知识 · 3 · 表 1.1. C 语言关键字 auto break case char const (C90) continue default do double else enum (C90) extern float for goto if inline (C99) int long register restrict return short signed (C90) sizeof static struct switch typedef union unsigned void volatile (C90) while _Alignas _Alignof _Bool _Complex _Generic _Imaginary _Noreturn _Static_assert #_Thread_local 1.2.2 C 语言数据类型 C 语言的数据类型可分为基本数据类型和派生(扩展)数据类型. • 基本数据类型: 整型, 实型, 字符型(char)和布尔型(_Bool) (1) 整型: int, short, long, unsigned int, unsigned short, unsigned long (2) 实型: float, double 表 1.2. C 语言基本数据类型 数据类型 关键字 所占字节 表示范围 整型 short 2 −2 15 ∼ 2 15 − 1 int 2 / 4 −2 15 ∼ 2 15 − 1 / −2 31 ∼ 2 31 − 1 long 4 / 8 −2 31 ∼ 2 31 − 1 / −2 63 ∼ 2 63 − 1 unsigned short 2 0 ∼ 2 16 − 1 unsigned int 2 / 4 0 ∼ 2 16 − 1 / 0 ∼ 2 32 − 1 unsigned long 4 / 8 0 ∼ 2 32 − 1 / 0 ∼ 2 64 − 1 实型 float 4 (6 位有效数字) 10−38 ∼ 1038 double 8 (15 位有效数字) 10−308 ∼ 10308 布尔型 _Bool 1 0, 1 字符型 char 1 b 注记:事实上, C 语言标准没有规定每种数据类型的具体字节数和表示范围, 只规定大小顺 序, 即长度满足下面的关系式 char <= short <= int <= long <= long long 具体长度由编译器决定. • 派生(扩展、导出、自定义)数据类型: 数组, 指针, 枚举, 结构, 联合, 复数, 等等 http://math.ecnu.edu.cn/~jypan
4 第一讲编程基础 整型 short,int,long signed,unsigned 实型 float,double 恭本数据类型 字符型 char 布尔型 Bool c99 数 数组 类型 派生米型 指针 扩展类型 结构与联合 复数 c99 空类型 void- 指针、函数 枚举型 enum ·为一个已有的数据类型另外命名:typedef typedef已有数据类型名新数据类型名 例1山给已有数据类型取别名 (C_datatype_typedef.c) #include main() bool flag=1; real x=3.14; printf("flag-%d,x=%f\n",flag,x); f1ag=-1; 545673 rn1ag-d,XAn,f1ag,x刘 return 0; ·数据类型的转换 (1)自动转换/隐式转换: .相同张到的数据井行运竹时甘结里们姚是同数据类型.如3/)的结果是1: 不同类型的数据进行运算时,需要先转换成同一数据类型,然后再进行相应的运算 http://math.ecnu.edu.cn/-jypan
· 4 · 第一讲 编程基础 C 语 言 程 序 设 计 数 据 类 型 基本数据类型 整型 short,int,long 实型 float,double 字符型 char 布尔型 _Bool 派生类型 扩展类型 数组 指针 结构与联合 复数 空类型 void 枚举型 enum C99 指针、函数 signed,unsigned C99 • 为一个已有的数据类型另外命名: typedef ✞ ☎ typedef 已有数据类型名 新数据类型名 ✝ ✆ 例 1.1 给已有数据类型取别名. (C_datatype_typedef.c) 1 #include 2 3 typedef _Bool bool; 4 typedef float real; 5 6 main() 7 { 8 bool flag=1; 9 real x=3.14; 10 11 printf("flag=%d, x=%f\n", flag, x); 12 13 flag=‐1; 14 x=2.78; 15 printf("flag=%d, x=%f\n", flag, x); 16 17 return 0; 18 } • 数据类型的转换 (1) 自动转换/隐式转换: 相同类型的数据进行运算时, 其结果仍然是同一数据类型, 如 3/2 的结果是 1; 不同类型的数据进行运算时, 需要先转换成同一数据类型, 然后再进行相应的运算; http://math.ecnu.edu.cn/~jypan
1.2C语言基础知识 .5 一转换按数据长度增加的方向进行,以尽可能地保证精度不会降低: ·所有的浮点运算都是以双精度进行的: 赋值号两边数据的类型不同时,需先将右边表达式的值转换为左边数据的类型,然后再赋 值: ,char型数据和short型数据进行运算时,需转换成int型: 字符变量直接参与算术运算时,先转化位相应的ASCI码,然后进行运算 char-->short-->int-->unsigned-->long --unsigned long-->double <--float (2)强制转换/显式转换 (类型标识符)表达式/将表达式的值转化为指定的数据类型 例1.2(类型转换)已知有下面的代码 x b/a; 11×=2.8 (①)由于a和b都是整型,因此表达式b/a的值也是整型,即b/a=2.将其赋值给doub1e型 变量x,因此x=2.0. (2)在计算(double)b/a时,先将b的值转化为doub1e型(注意,不是将b转化为doub1e 型,变量b的类型是不会改变的,然后与a相除.由于是一个double型的数据与一个 int型的数据进行运算,所以系统会自动将int型的数据转化为double型的数据,然 后再做运算.所以最后的结果是2.5. 3)在计算(doub1e)(b/a)时,是先计算b/a,然后将结果转化为doub1e型,所以最后的 结果是z=doub1e(2)=2.0 (④需要注意的是,变量a,b的类型在整个计算过程中是始终不变的,即一直是int型. 凸注记:类型转换是临时性的,类型转换不会改变变量本身的数据类型」 (⑤)类型转换规则: ·浮点型转整型:直接丢掉小数部分 ,字符型转整型:取字符的ASCI码 整型转字符型:ASC码对应的字符 1.23变量与常量 ·变量:存储数据,值可以改变 ()变量名:命名规则与标识符相同 (2)变量必须先声明,后使用:先赋值,后使用。 (3)变量声明: 类型标识符变量名列表 http://math.ecnu.edu.cn/-jypan
1.2 C 语言基础知识 · 5 · 转换按数据长度增加的方向进行, 以尽可能地保证精度不会降低; 所有的浮点运算都是以双精度进行的; 赋值号两边数据的类型不同时, 需先将右边表达式的值转换为左边数据的类型, 然后再赋 值; char 型数据和 short 型数据进行运算时, 需转换成 int 型; 字符变量直接参与算术运算时, 先转化位相应的 ASCII 码, 然后进行运算. char ‐‐> short ‐‐> int ‐‐> unsigned ‐‐> long ‐‐> unsigned long ‐‐> double <‐‐ float (2) 强制转换/显式转换 ✞ ☎ (类型标识符)表达式 // 将表达式的值转化为指定的数据类型 ✝ ✆ 例 1.2 (类型转换) 已知有下面的代码 1 int a=2, b=5; 2 double x, y, z; 3 4 x = b/a; // x = 2.0 5 y = (double)b/a; // y = 2.5 6 z = (double)(b/a); // z = 2.0 (1) 由于 a 和 b 都是整型, 因此表达式 b/a 的值也是整型, 即 b/a=2. 将其赋值给 double 型 变量 x, 因此 x=2.0. (2) 在计算 (double)b/a 时, 先将 b 的值转化为 double 型 (注意, 不是将 b 转化为 double 型, 变量 b 的类型是不会改变的!), 然后与 a 相除. 由于是一个 double 型的数据与一个 int 型的数据进行运算, 所以系统会自动将 int 型的数据转化为 double 型的数据, 然 后再做运算. 所以最后的结果是 2.5. (3) 在计算 (double)(b/a) 时, 是先计算 b/a, 然后将结果转化为 double 型, 所以最后的 结果是 z=double(2)=2.0 (4) 需要注意的是, 变量 a, b 的类型在整个计算过程中是始终不变的, 即一直是 int 型. b 注记:类型转换是临时性的, 类型转换不会改变变量本身的数据类型! (5) 类型转换规则: 浮点型转整型: 直接丢掉小数部分; 字符型转整型: 取字符的 ASCII 码; 整型转字符型: ASCII 码对应的字符. 1.2.3 变量与常量 • 变量: 存储数据, 值可以改变 (1) 变量名: 命名规则与标识符相同 (2) 变量必须先声明, 后使用; 先赋值, 后使用. (3) 变量声明: ✞ ☎ 类型标识符 变量名列表; ✝ ✆ http://math.ecnu.edu.cn/~jypan
.6 第一讲编程基础 可以同时声明多个变量,用逗号隔开 -变量声明时可以初始化 1 iti,j,k=0;/同时声明3个整型变量,但只对变量k进行初始化 double pi=3.14159: char c; ·常量(常数、字符串:在程序运行中值不能改变的量 ()整型常量:整数,后面加1或L表示长整型,后面加u或U表示无符号整型: (2)实型常量:缺省为双精度实数,后面加f或F表示单精度,加1或L表示1 ong double (③)字符型常量:用单引号括起来的单个字符和转义字符: (④字符串常量:用双引号括起来的字符序列: (5)布尔常量:true和false(需加头文件:#include) ·符号常量:用标识符表示常量 (1)声明方式 const类型标识符变量名=值; 1const float PI=3.1415926 (2)符号常量在声明时必须初始化 (③)符号常量的值在程序中不能被修改(即不能被重新赋值) ·枚举:定义新的数据类型 enUm枚举类型名{变量可取值列表,即枚举元素}; 1.2.4运算与表达式 ·运算符 ()算术运算符:+、-、*、/、%、+(自增)、-(自减) (2)就值运符:=、+=,-=。=、/=、%=、&=、|=、=、》》=、《《= (③)逗号运算符:,(把若干表达式组合成一个表达式) (④关系运算符:用于比较运算,>、三、〈=、I= (5⑤)逻辑运算符:用于逻辑运算,&、1川、! (条件运算符:?:,是一个三目运算符,用于条件求值 (7)求字节数运算符:s1zeof(变量/数据/类型标识符) (⑧)位操作运算符:按二进制位进行运算,&、|、~、(异或)、(佑移) (9)指针运算符:*(取内容)、&(取地址) ·运算符优先级:(https:/en.cppreference.com/w/c/language/operator_precedence ·语句 (1)空语句(只有分号) (2)声明语句 (⑤)表达式语句: (④)复合语句(将多个语句用{}括起来组成的一个语句); (⑤)选择语句,循环语句,跳转语句: (6. http://math.ecnu.edu.cn/-jypan
· 6 · 第一讲 编程基础 可以同时声明多个变量, 用逗号隔开 变量声明时可以初始化 ✞ ☎ 1 int i, j, k=0; // 同时声明 3 个整型变量, 但只对变量 k 进行初始化 2 double pi=3.14159; 3 char c; ✝ ✆ • 常量 (常数、字符串): 在程序运行中值不能改变的量 (1) 整型常量: 整数, 后面加 l 或 L 表示长整型, 后面加 u 或 U 表示无符号整型; (2) 实型常量: 缺省为双精度实数, 后面加 f 或 F 表示单精度, 加 l 或 L 表示 long double (3) 字符型常量: 用单引号括起来的单个字符和转义字符; (4) 字符串常量: 用双引号括起来的字符序列; (5) 布尔常量: true 和 false (需加头文件: #include ) • 符号常量: 用标识符表示常量 (1) 声明方式: ✞ ☎ const 类型标识符 变量名 = 值; ✝ ✆ ✞ ☎ 1 const float PI=3.1415926; ✝ ✆ (2) 符号常量在声明时必须初始化; (3) 符号常量的值在程序中不能被修改(即不能被重新赋值) • 枚举: 定义新的数据类型 ✞ ☎ enum 枚举类型名 {变量可取值列表, 即枚举元素}; ✝ ✆ 1.2.4 运算与表达式 • 运算符 (1) 算术运算符: +、‐、*、/、%、++ (自增)、‐‐ (自减) (2) 赋值运算符: =、+=、‐=、*=、/=、%= 、&=、|=、^=、>>=、、=、> (右移) (9) 指针运算符: * (取内容)、& (取地址) • 运算符优先级: (https://en.cppreference.com/w/c/language/operator_precedence) • 语句 (1) 空语句(只有分号) (2) 声明语句; (3) 表达式语句; (4) 复合语句(将多个语句用 { } 括起来组成的一个语句); (5) 选择语句, 循环语句, 跳转语句; (6) ... ... http://math.ecnu.edu.cn/~jypan
1.2C语言基础知识 .7 ·表达式:由运算符连接常量、变量、函数等所组成的式子: 。赋值语句 (①)标准赋值语句 变量=表达式; 13 2=y=3;∥等价于y=3;=y;这种赋值方式不能用于初始化 (2)自增自减:+,- ·前置:先自增或自减,然后参与表达式运算 ·后置:先参与表达式运算,然后自增或自减: -不要在同一语句中包含一个变量的多个+或-一,因为它们的解释在CC+标准中没有 规定,完全取决于编译器的个人行为.另外,也不要出现y=x+*x;以及类似的语句, 1 x+;/等价于x=x+1; +x;/川等价于X=x+1; y=X+*3;∥等价于y=3;=x+1;如果是yx4+*%,则结果怎样 4 y+x*3;∥等价于X=x+1;y=x*3 (3)复合赋值运算符:+=、=、*=、/=、%= 1 int x 2X4=3;1∥等价子X=x43到 3x3;11等价于x=x/3到 ·逗号运算符: 表达式1,表达式2 (1)先计算表达式1,再计算表达式2,并将表达式2的值作为整个表达式的结果 1int a=2,b; 2 a=35,a+10;1∥a=12or152 3b=(3*5,a+18);11b=? 山注记:为了避免由运算优先级所导致的低级错误,建议多使用小括号 ·位运算符:按二进制位进行运算 &、1、人(异或)、~(取反)、》(右移) ·求字节数运算符 sizeof(变量) 川返回指定变量所占的字节数 S1zof(数据类型)/返回存储单个指定数据类型的数据所需的字节数 s1ze0f(表达式)返回存储表达式结果所需的字节数 http://math.ecnu.edu.cn/-jypan
1.2 C 语言基础知识 · 7 · • 表达式: 由运算符连接常量、变量、函数等所组成的式子; • 赋值语句 (1) 标准赋值语句 ✞ ☎ 变量=表达式; ✝ ✆ ✞ ☎ 1 x=3; 2 x=y=3; // 等价于 y=3; x=y; 这种赋值方式不能用于初始化 ✝ ✆ (2) 自增自减: ++, ‐‐ 前置: 先自增或自减, 然后参与表达式运算; 后置: 先参与表达式运算, 然后自增或自减; 不要在同一语句中包含一个变量的多个 ++ 或 ‐‐, 因为它们的解释在 C/C++ 标准中没有 规定, 完全取决于编译器的个人行为. 另外, 也不要出现 y=x++*x; 以及类似的语句. ✞ ☎ 1 x++; // 等价于 x=x+1; 2 ++x; // 等价于 x=x+1; 3 y=x++*3; // 等价于 y=x*3; x=x+1; 如果是 y=x++*x, 则结果怎样? 4 y=++x*3; // 等价于 x=x+1; y=x*3; ✝ ✆ (3) 复合赋值运算符: +=、‐=、*=、/=、%= ✞ ☎ 1 int x 2 x+=3; // 等价于 x=x+3; 3 x/=3; // 等价于 x=x/3; ✝ ✆ • 逗号运算符: ✞ ☎ 表达式1, 表达式2 ✝ ✆ (1) 先计算 表达式 1, 再计算 表达式 2, 并将 表达式 2 的值作为整个表达式的结果. ✞ ☎ 1 int a=2, b; 2 a = 3*5, a+10; // a=12 or 15? 3 b = (3*5, a+10); // b=? ✝ ✆ b 注记:为了避免由运算优先级所导致的低级错误, 建议多使用小括号. • 位运算符: 按二进制位进行运算 &、|、^ (异或)、~ (取反) 、> (右移) • 求字节数运算符: ✞ ☎ sizeof(变量) // 返回指定变量所占的字节数 sizeof(数据类型) // 返回存储单个指定数据类型的数据所需的字节数 sizeof(表达式) // 返回存储表达式结果所需的字节数 ✝ ✆ http://math.ecnu.edu.cn/~jypan