vault backup: 2026-01-22 20:49:01

This commit is contained in:
2026-01-22 20:49:01 +08:00
parent b810d55176
commit 4ff1cb1a94
6 changed files with 175 additions and 162 deletions

View File

@@ -8,5 +8,13 @@
"key": "D" "key": "D"
} }
], ],
"templater-obsidian:jump-to-next-cursor-location": [] "templater-obsidian:jump-to-next-cursor-location": [],
"editor:toggle-code": [
{
"modifiers": [
"Mod"
],
"key": "`"
}
]
} }

View File

@@ -11,10 +11,15 @@
"id": "53c9f5efa5aa3efd", "id": "53c9f5efa5aa3efd",
"type": "leaf", "type": "leaf",
"state": { "state": {
"type": "empty", "type": "markdown",
"state": {}, "state": {
"file": "Collection/YoudaoyunNotes/02C语言/02-C语言入门.md",
"mode": "source",
"source": false,
"backlinks": false
},
"icon": "lucide-file", "icon": "lucide-file",
"title": "新标签页" "title": "02-C语言入门"
} }
} }
] ]
@@ -84,12 +89,13 @@
"state": { "state": {
"type": "outline", "type": "outline",
"state": { "state": {
"file": "Collection/YoudaoyunNotes/02C语言/02-C语言入门.md",
"followCursor": true, "followCursor": true,
"showSearch": false, "showSearch": false,
"searchQuery": "" "searchQuery": ""
}, },
"icon": "lucide-list", "icon": "lucide-list",
"title": "大纲" "title": "02-C语言入门 的大纲"
} }
}, },
{ {
@@ -241,8 +247,25 @@
"publish:发布更改": false "publish:发布更改": false
} }
}, },
"active": "5e96455aab22a229", "active": "b1cf03bb19fff71c",
"lastOpenFiles": [ "lastOpenFiles": [
"Collection/YoudaoyunNotes/02C语言/14-预处理与文件组织.md",
"Collection/YoudaoyunNotes/02C语言/15-静态库与动态库.md",
"Collection/YoudaoyunNotes/02C语言/13-结构体、联合体与枚举.md",
"Collection/YoudaoyunNotes/02C语言/12-作用域与存储期.md",
"Collection/YoudaoyunNotes/02C语言/11-内存管理.md",
"Collection/YoudaoyunNotes/02C语言/10-函数进阶.md",
"Collection/YoudaoyunNotes/02C语言/09-数组与指针进阶.md",
"Collection/YoudaoyunNotes/02C语言/08-指针.md",
"Collection/YoudaoyunNotes/02C语言/07-数组.md",
"Collection/YoudaoyunNotes/02C语言/06-函数基础.md",
"Collection/YoudaoyunNotes/02C语言/05-控制与分支.md",
"Collection/YoudaoyunNotes/02C语言/04-运算符.md",
"Collection/YoudaoyunNotes/02C语言/03-数据类型及IO流.md",
"Collection/YoudaoyunNotes/02C语言/02-C语言入门.md",
"Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCE40a76a7d230733292ec04717f3f6f254编程规范.pdf",
"Collection/YoudaoyunNotes/02C语言/01-C语言概述.md",
"Collection/YoudaoyunNotes/02C语言/[01-拓展]printf输出颜色与字体控制.md",
"YueQian/MarkdownNotes/CQ2605/01Linux基础/06_常用Shell命令.md", "YueQian/MarkdownNotes/CQ2605/01Linux基础/06_常用Shell命令.md",
"Collection/YoudaoyunNotes/02C语言/images/WEBRESOURCEf9401753ae5405e97b73dbc1662bfc9001416f17412c415232ef6faf014cdff5.png", "Collection/YoudaoyunNotes/02C语言/images/WEBRESOURCEf9401753ae5405e97b73dbc1662bfc9001416f17412c415232ef6faf014cdff5.png",
"Collection/YoudaoyunNotes/02C语言/images/WEBRESOURCEfb6a239bed5b462a85fa7ec4382c92210d7713ba345e0119c37b9a76eb31bf65.png", "Collection/YoudaoyunNotes/02C语言/images/WEBRESOURCEfb6a239bed5b462a85fa7ec4382c92210d7713ba345e0119c37b9a76eb31bf65.png",
@@ -262,24 +285,7 @@
"Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCEa2d88b6292b52c177b4bc6323a5bdd07函数作业题.docx", "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCEa2d88b6292b52c177b4bc6323a5bdd07函数作业题.docx",
"Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCE94606765850c0696e801236ba49014a2函数练习题.docx", "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCE94606765850c0696e801236ba49014a2函数练习题.docx",
"Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCE757c8acbaa371ecec8cc55fab8756448运算符测试.docx", "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCE757c8acbaa371ecec8cc55fab8756448运算符测试.docx",
"Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCE40a76a7d230733292ec04717f3f6f254编程规范.pdf",
"Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCE224e5f8aa53ceb5fc88f45d79932378a内存管理测试题.docx", "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCE224e5f8aa53ceb5fc88f45d79932378a内存管理测试题.docx",
"Collection/YoudaoyunNotes/02C语言/[01-拓展]printf输出颜色与字体控制.md",
"Collection/YoudaoyunNotes/02C语言/15-静态库与动态库.md",
"Collection/YoudaoyunNotes/02C语言/14-预处理与文件组织.md",
"Collection/YoudaoyunNotes/02C语言/13-结构体、联合体与枚举.md",
"Collection/YoudaoyunNotes/02C语言/12-作用域与存储期.md",
"Collection/YoudaoyunNotes/02C语言/11-内存管理.md",
"Collection/YoudaoyunNotes/02C语言/10-函数进阶.md",
"Collection/YoudaoyunNotes/02C语言/09-数组与指针进阶.md",
"Collection/YoudaoyunNotes/02C语言/08-指针.md",
"Collection/YoudaoyunNotes/02C语言/07-数组.md",
"Collection/YoudaoyunNotes/02C语言/06-函数基础.md",
"Collection/YoudaoyunNotes/02C语言/05-控制与分支.md",
"Collection/YoudaoyunNotes/02C语言/04-运算符.md",
"Collection/YoudaoyunNotes/02C语言/03-数据类型及IO流.md",
"Collection/YoudaoyunNotes/02C语言/02-C语言入门.md",
"Collection/YoudaoyunNotes/02C语言/01-C语言概述.md",
"Collection/YoudaoyunNotes/01Linux基础/06_常用Shell命令.md", "Collection/YoudaoyunNotes/01Linux基础/06_常用Shell命令.md",
"Collection/YoudaoyunNotes/01Linux基础/05_网络配置.md", "Collection/YoudaoyunNotes/01Linux基础/05_网络配置.md",
"Collection/YoudaoyunNotes/01Linux基础/04_命令行编辑与编译.md", "Collection/YoudaoyunNotes/01Linux基础/04_命令行编辑与编译.md",
@@ -288,7 +294,6 @@
"Collection/YoudaoyunNotes/01Linux基础/01-开发环境安装.md", "Collection/YoudaoyunNotes/01Linux基础/01-开发环境安装.md",
"Collection/YoudaoyunNotes/01Linux基础/00-简介.md", "Collection/YoudaoyunNotes/01Linux基础/00-简介.md",
"Collection/CQ2605/02C语言/[01-拓展]printf输出颜色与字体控制.md", "Collection/CQ2605/02C语言/[01-拓展]printf输出颜色与字体控制.md",
"Collection/CQ2605/02C语言/15-静态库与动态库.md",
"YueQian/Homework/未命名.canvas", "YueQian/Homework/未命名.canvas",
"Excalidraw/未命名.canvas", "Excalidraw/未命名.canvas",
"未命名.canvas" "未命名.canvas"

View File

@@ -8,15 +8,15 @@ C语言程序源码文件以.c结尾一个C语言程序主要包括以下部
| 指令 | 说明 | | 指令 | 说明 |
| -- | -- | | -- | -- |
| #include | 包含(引入)一个源代码文件 | | `#include` | 包含(引入)一个源代码文件 |
| #define | 定义一个宏 | | `#define` | 定义一个宏 |
| #undef | 取消已定义的宏 | | `#undef` | 取消已定义的宏 |
| #if | 如果给定条件为真,则编译其后的代码 | | `#if` | 如果给定条件为真,则编译其后的代码 |
| #ifdef | 如果宏已经定义,则编译其后的代码 | | `#ifdef` | 如果宏已经定义,则编译其后的代码 |
| #ifndef | 如果宏没有定义,则编译其后的代码 | | `#ifndef` | 如果宏没有定义,则编译其后的代码 |
| #elif | 如果前面的 #if 给定条件为假,并且当前条件为真,则编译其后的代码 | | `#elif` | 如果前面的 `#if` 给定条件为假,并且当前条件为真,则编译其后的代码 |
| #endif | 结束一个 #if#ifdef 或者 #ifndef 条件编译块 | | `#endif` | 结束一个 `#if``#ifdef` 或者 `#ifndef` 条件编译块 |
| #defined | 这不是命令,而是操作符,用来判断某个宏是否已被定义。 | | `#defined` | 这不是命令,而是操作符,用来判断某个宏是否已被定义。 |
- 主函数main函数 --> C语言程序的入口一个C语言程序有且仅有一个主函数main - 主函数main函数 --> C语言程序的入口一个C语言程序有且仅有一个主函数main
@@ -25,7 +25,7 @@ C语言程序源码文件以.c结尾一个C语言程序主要包括以下部
- 语句及表达式:语句以英文分号;结尾if(....)表达式等等 - 语句及表达式:语句以英文分号;结尾if(....)表达式等等
- 注释:语句或表达式的解释,单行(//)和多行(/* */ - 注释:语句或表达式的解释,单行(`//`)和多行(`/* */`
1. **C语言的语法** 1. **C语言的语法**
@@ -39,11 +39,11 @@ C语言程序源码文件以.c结尾一个C语言程序主要包括以下部
- 常量Constants数值不能修改的量 - 常量Constants数值不能修改的量
- 字符串值String Literals"" - 字符串值String Literals`""`
- 运算符Operators: +、-、*、/..... - 运算符Operators: `+、-、*、/.....`
- 分隔符Separators: ; - 分隔符Separators: `;`
1. 分号; 1. 分号;
@@ -51,11 +51,11 @@ C语言程序源码文件以.c结尾一个C语言程序主要包括以下部
1. 注释 1. 注释
在C语言程序中注释用于说明语句或程序的功能和使用方法注释的语句不会参与到程序的运行只用于开发人员或 使用人员进行查阅C语言程序注释的方式有单行(// )和多行(/* */)两种。注释不能嵌套使用。 在C语言程序中注释用于说明语句或程序的功能和使用方法注释的语句不会参与到程序的运行只用于开发人员或 使用人员进行查阅C语言程序注释的方式有单行(`//` )和多行(`/* */`)两种。注释不能嵌套使用。
单行注释: // 需要注释的内容 单行注释: // 需要注释的内容
多行注释:/* 需要注释的内容 */ 多行注释:`/* 需要注释的内容 */`
1. 标识符 1. 标识符
@@ -76,58 +76,58 @@ abc 123× _123 a&b× Ace(√) int(×)
在C语言程序中具有特殊功能或含义的单词函数名、变量名、常量名及其他用户标识符不能是关键字 在C语言程序中具有特殊功能或含义的单词函数名、变量名、常量名及其他用户标识符不能是关键字
| 关键字 | 说明 | | 关键字 | 说明 |
| -- | -- | | ---------- | ---------------------------------- |
| auto | 声明自动变量 | | `auto` | 声明自动变量 |
| break | 跳出当前循环 | | `break` | 跳出当前循环 |
| case | 开关语句分支 | | `case` | 开关语句分支 |
| char | 声明字符型变量或函数返回值类型 | | `char` | 声明字符型变量或函数返回值类型 |
| const | 定义常量,如果一个变量被 const 修饰,那么它的值就不能再被改变 | | `const` | 定义常量,如果一个变量被 const 修饰,那么它的值就不能再被改变 |
| continue | 结束当前循环,开始下一轮循环 | | `continue` | 结束当前循环,开始下一轮循环 |
| default | 开关语句中的"其它"分支 | | `default` | 开关语句中的"其它"分支 |
| do | 循环语句的循环体 | | `do` | 循环语句的循环体 |
| double | 声明双精度浮点型变量或函数返回值类型 | | `double` | 声明双精度浮点型变量或函数返回值类型 |
| else | 条件语句否定分支(与 if 连用) | | `else` | 条件语句否定分支(与 if 连用) |
| enum | 声明枚举类型 | | `enum` | 声明枚举类型 |
| extern | 声明变量或函数是在其它文件或本文件的其他位置定义 | | `extern` | 声明变量或函数是在其它文件或本文件的其他位置定义 |
| float | 声明浮点型变量或函数返回值类型 | | `float` | 声明浮点型变量或函数返回值类型 |
| for | 一种循环语句 | | `for` | 一种循环语句 |
| goto | 无条件跳转语句 | | `goto` | 无条件跳转语句 |
| if | 条件语句 | | `if` | 条件语句 |
| int | 声明整型变量或函数 | | `int` | 声明整型变量或函数 |
| long | 声明长整型变量或函数返回值类型 | | `long` | 声明长整型变量或函数返回值类型 |
| register | 声明寄存器变量 | | `register` | 声明寄存器变量 |
| return | 子程序返回语句(可以带参数,也可不带参数) | | `return` | 子程序返回语句(可以带参数,也可不带参数) |
| short | 声明短整型变量或函数 | | `short` | 声明短整型变量或函数 |
| signed | 声明有符号类型变量或函数 | | `signed` | 声明有符号类型变量或函数 |
| sizeof | 计算数据类型或变量长度(即所占内存字节数) | | `sizeof` | 计算数据类型或变量长度(即所占内存字节数) |
| static | 声明静态变量 | | `static` | 声明静态变量 |
| struct | 声明结构体类型 | | `struct` | 声明结构体类型 |
| switch | 用于开关语句 | | `switch` | 用于开关语句 |
| typedef | 用以给数据类型取别名 | | `typedef` | 用以给数据类型取别名 |
| unsigned | 声明无符号类型变量或函数 | | `unsigned` | 声明无符号类型变量或函数 |
| union | 声明共用体类型 | | `union` | 声明共用体类型 |
| void | 声明函数无返回值或无参数,声明无类型指针 | | `void` | 声明函数无返回值或无参数,声明无类型指针 |
| volatile | 说明变量在程序执行中可被隐含地改变 | | `volatile` | 说明变量在程序执行中可被隐含地改变 |
| while | 循环语句的循环条件 | | `while` | 循环语句的循环条件 |
### C99 新增关键字 ### C99 新增关键字
| _Bool | _Complex | _Imaginary | inline | restrict | | `_Bool` | `_Complex` | `_Imaginary` | `inline` | `restrict` |
### C11 新增关键字 ### C11 新增关键字
| _Alignas | _Alignof | _Atomic | _Generic | _Noreturn | | `_Alignas` | `_Alignof` | `_Atomic` | `_Generic` | `_Noreturn` |
| -- | -- | -- | -- | -- | | ---------------- | --------------- | ------- | -------- | --------- |
| _Static_assert | _Thread_local | | | | | `_Static_assert` | `_Thread_local` | | | |
# 二、编程规范 # 二、编程规范
1. 命名方式 1. 命名方式
自定义标识符时要做到 自定义标识符时要做到**见名知意**
变量名max_number zui_da_zhi maxNumber 变量名max_number zui_da_zhi maxNumber
@@ -135,25 +135,25 @@ abc 123× _123 a&b× Ace(√) int(×)
常见的命名方式: 常见的命名方式:
- 驼峰式 - ==驼峰式==
以小写或大写字母开头后面跟大写或小写字母如myAppMyName等类似的命名方式 以小写或大写字母开头后面跟大写或小写字母如myAppMyName等类似的命名方式
- 匈牙利命名法 - 匈牙利命名法
以变量类型的缩写开头如int iCount; unsigned int uiNum;等 以变量类型的缩写开头,如`int iCount; unsigned int uiNum;`
- 帕斯卡命名法 - 帕斯卡命名法
类似与驼峰式命名法以大写字母开头如MyAppMyName等 类似与驼峰式命名法以大写字母开头如MyAppMyName等
- 下划线命名法 - ==下划线命名法==
在Linux中最常见的命名方式Linux一些系统库、开源软件等编码中较为常见。 在Linux中最常见的命名方式Linux一些系统库、开源软件等编码中较为常见。
如char my_name[10];int first_num;等 `char my_name[10];int first_num;`
1. 缩进 2. 缩进
在C语言源码中缩进要对齐代码要有层级体现最好用 8 个空格缩进,避免用 4 个空格甚至是 2 个空格 在C语言源码中缩进要对齐代码要有层级体现最好用 8 个空格缩进,避免用 4 个空格甚至是 2 个空格
@@ -169,15 +169,15 @@ void fun(void)
} }
``` ```
1. 空格和空行 3. 空格和空行
空格和空行也是提高程序可读性的很重要的一方面,谁都不愿意阅读挤在一起的代码, 因此适当的空格和空行能让程序看起来逻辑更加清晰。 空格和空行也是提高程序可读性的很重要的一方面,谁都不愿意阅读挤在一起的代码, 因此适当的空格和空行能让程序看起来逻辑更加清晰。
1. 括号 4. 括号
函数体和循环结构、分支结构等代码块需要用到花括号将其代码括起来,对于函数而言, 在 LINUX 编码风格中,左右花括号分别占用一行,在其他的代码块中,左花括号可以放在 上一行的最右边,右花括号单独占一行(推荐像函数一样左右括号各自单独占一行,使得代码的风格更具一致性)。 函数体和循环结构、分支结构等代码块需要用到花括号将其代码括起来,对于函数而言, 在 LINUX 编码风格中,左右花括号分别占用一行,在其他的代码块中,左花括号可以放在 上一行的最右边,右花括号单独占一行(推荐像函数一样左右括号各自单独占一行,使得代码的风格更具一致性)。
1. 注释 5. 注释
在我们编写程序的时候,如果遇到比较复杂的情形,我们可以在代码中用自然语言添加 一些内容,来辅助我们自己和将来要阅读该程序的人员更好地理解程序。 在我们编写程序的时候,如果遇到比较复杂的情形,我们可以在代码中用自然语言添加 一些内容,来辅助我们自己和将来要阅读该程序的人员更好地理解程序。

View File

@@ -681,13 +681,13 @@ float x = a + b - (int)c;// 在该表达式中a将隐士的转换为int类型
- 数据类型的典型大小: - 数据类型的典型大小:
| 数据类型 | 16 位平台(字节) | 32 位平台(字节) | 64 位平台(字节) | 说明 | | 数据类型 | 16 位平台(字节) | 32 位平台(字节) | 64 位平台(字节) | 说明 | |
| -- | -- | -- | -- | -- | | --------- | ---------- | ---------- | ---------- | ------------------------------------------------ | --- |
| char | 1 | 1 | 1 | 始终为 1 字节8 位),用于存储字符或小整数 | | char | 1 | 1 | 1 | 始终为 1 字节8 位),用于存储字符或小整数 | |
| short | 2 | 2 | 2 | 至少 2 字节,通常固定为 2 字节16 位) | | short | 2 | 2 | 2 | 至少 2 字节,通常固定为 2 字节16 位) | |
| int | 2 | 4 | 4 | 与平台 “字长” 相关16 位平台为 2 字节32/64 位平台通常为 4 字节(但不绝对) | | int | 2 | 4 | 4 | 与平台 “字长” 相关16 位平台为 2 字节32/64 位平台通常为 4 字节(但不绝对) | |
| long | 4 | 4 | 8 | 32 位平台与 | | long | 4 | 4 | 8 | 32 位平台与 | |
| long long | 8 | 8 | 8 | C99 标准引入,固定为 8 字节64 位),用于表示更大范围的整数 | | long long | 8 | 8 | 8 | C99 标准引入,固定为 8 字节64 位),用于表示更大范围的整数 | |
- 可移植整型关键typedef - 可移植整型关键typedef

View File

@@ -83,7 +83,7 @@ printf("b=%d\n", ++b); // 前缀先加后用 11
- char a; if(a) ==> if(a!='\0') - char a; if(a) ==> if(a!='\0')
- int *a; if(a) ==> if(a!=NULL) - `int *a; if(a) ==> if(a!=NULL)`
- bool a; if(a) ==> if(a!=false) - bool a; if(a) ==> if(a!=false)
@@ -265,52 +265,52 @@ int x = (a++,b++,a+b); // 需要使用括号包含,因为,运算符的优先
# 七、运算符优先级 # 七、运算符优先级
| 优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 | | 优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 | | | | |
| -- | -- | -- | -- | -- | -- | | ------ | -------- | -------------- | ---------- | ---- | -------- | --- | --- | --- | --- |
| 1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | -- | | 1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | -- | | | | |
| () | 圆括号 | (表达式)/函数名(形参表) | | () | 圆括号 | (表达式)/函数名(形参表) | | | | | | | |
| . | 成员选择(对象) | 对象.成员名 | | . | 成员选择(对象) | 对象.成员名 | | | | | | | |
| -> | 成员选择(指针) | 对象指针->成员名 | | -> | 成员选择(指针) | 对象指针->成员名 | | | | | | | |
| 2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 | | 2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 | | | | |
| ~ | 按位取反运算符 | ~表达式 | | ~ | 按位取反运算符 | ~表达式 | | | | | | | |
| ++ | 自增运算符 | ++变量名/变量名++ | | ++ | 自增运算符 | ++变量名/变量名++ | | | | | | | |
| -- | 自减运算符 | --变量名/变量名-- | | -- | 自减运算符 | --变量名/变量名-- | | | | | | | |
| * | 取值运算符 | *指针变量 | | * | 取值运算符 | *指针变量 | | | | | | | |
| & | 取地址运算符 | &变量名 | | & | 取地址运算符 | &变量名 | | | | | | | |
| ! | 逻辑非运算符 | !表达式 | | ! | 逻辑非运算符 | !表达式 | | | | | | | |
| (类型) | 强制类型转换 | (数据类型)表达式 | -- | | (类型) | 强制类型转换 | (数据类型)表达式 | -- | | | | | | |
| sizeof | 长度运算符 | sizeof(表达式) | | sizeof | 长度运算符 | sizeof(表达式) | | | | | | | |
| 3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 | | 3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 | | | | |
| * | 乘 | 表达式*表达式 | | * | 乘 | 表达式*表达式 | | | | | | | |
| % | 余数(取模) | 整型表达式%整型表达式 | | % | 余数(取模) | 整型表达式%整型表达式 | | | | | | | |
| 4 | + | 加 | 表达式+表达式 | 左到右 | | 4 | + | 加 | 表达式+表达式 | 左到右 | | | | | |
| - | 减 | 表达式-表达式 | | - | 减 | 表达式-表达式 | | | | | | | |
| 5 | <<  | 左移 | 变量<<表达式 | 左到右 | | 5 | <<  | 左移 | 变量<<表达式 | 左到右 | | | | | |
| >>  | 右移 | 变量>>表达式 | | >>  | 右移 | 变量>>表达式 | | | | | | | |
| 6 | >  | 大于 | 表达式>表达式 | 左到右 | | 6 | >  | 大于 | 表达式>表达式 | 左到右 | | | | | |
| >= | 大于等于 | 表达式>=表达式 | | >= | 大于等于 | 表达式>=表达式 | | | | | | | |
| <  | 小于 | 表达式<表达式 | | <  | 小于 | 表达式<表达式 | | | | | | | |
| <= | 小于等于 | 表达式<=表达式 | | <= | 小于等于 | 表达式<=表达式 | | | | | | | |
| 7 | == | 等于 | 表达式==表达式 | 左到右 | | 7 | == | 等于 | 表达式==表达式 | 左到右 | | | | | |
| = | 不等于 | 表达式!= 表达式 | | = | 不等于 | 表达式!= 表达式 | | | | | | | |
| 8 | & | 按位与 | 表达式&表达式 | 左到右 | | 8 | & | 按位与 | 表达式&表达式 | 左到右 | | | | | |
| 9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | | 9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | | | | | |
| 10 | | | 按位或 | 表达式|表达式 | 左到右 | | 10 | | | 按位或 | 表达式 | 表达式 | 左到右 | | | |
| 11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | | 11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | | | | | |
| 12 | || | 逻辑或 | 表达式||表达式 | 左到右 | | 12 | | | | 逻辑或 | 表达式 | | 表达式 | 左到右 | |
| 13 | ?: | 条件运算符 | 表达式1? | 右到左 | 三目运算符 | | 13 | ?: | 条件运算符 | 表达式1? | 右到左 | 三目运算符 | | | | |
| 14 | = | 赋值运算符 | 变量=表达式 | 右到左 | -- | | 14 | = | 赋值运算符 | 变量=表达式 | 右到左 | -- | | | | |
| /= | 除后赋值 | 变量/=表达式 | | /= | 除后赋值 | 变量/=表达式 | | | | | | | |
| *= | 乘后赋值 | 变量*=表达式 | | *= | 乘后赋值 | 变量*=表达式 | | | | | | | |
| %= | 取模后赋值 | 变量%=表达式 | | %= | 取模后赋值 | 变量%=表达式 | | | | | | | |
| += | 加后赋值 | 变量+=表达式 | | += | 加后赋值 | 变量+=表达式 | | | | | | | |
| -= | 减后赋值 | 变量-=表达式 | | -= | 减后赋值 | 变量-=表达式 | | | | | | | |
| <<= | 左移后赋值 | 变量<<=表达式 | | <<= | 左移后赋值 | 变量<<=表达式 | | | | | | | |
| >>= | 右移后赋值 | 变量>>=表达式 | | >>= | 右移后赋值 | 变量>>=表达式 | | | | | | | |
| &= | 按位与后赋值 | 变量&=表达式 | | &= | 按位与后赋值 | 变量&=表达式 | | | | | | | |
| ^= | 按位异或后赋值 | 变量^=表达式 | | ^= | 按位异或后赋值 | 变量^=表达式 | | | | | | | |
| |= | 按位或后赋值 | 变量|=表达式 | | | = | 按位或后赋值 | 变量 | =表达式 | | | | | |
| 15 | | 逗号运算符 | 表达式,表达式,… | 左到右 | 从左到右顺序运算 | | 15 | | 逗号运算符 | 表达式,表达式,… | 左到右 | 从左到右顺序运算 | | | | |
记忆办法:去掉一个最高优先级括号(),去掉两个最低优先级赋值和逗号 记忆办法:去掉一个最高优先级括号(),去掉两个最低优先级赋值和逗号

View File

@@ -77,19 +77,19 @@ gcc hello.o -o hello
1. 向编译器传送特定指令:#progma 1. 向编译器传送特定指令:#progma
| 指令 | 描述 | 使用示例 | | 指令 | 描述 | 使用示例 | |
| -- | -- | -- | | ---------- | ----------------------- | ------------------- | --- |
| #define | 定义宏(符号常量或函数式宏) | #define PI 3.14159 | | `#define` | 定义宏(符号常量或函数式宏) | `#define PI 3.14159` | |
| #include | 包含头文件 | #include <stdio.h> | | `#include` | 包含头文件 | `#include <stdio.h>` | |
| #undef | 取消已定义的宏 | #undef PI | | `#undef` | 取消已定义的宏 | `#undef PI` | |
| #ifdef | 如果宏已定义则编译后续代码 | #ifdef DEBUG | | `#ifdef` | 如果宏已定义则编译后续代码 | `#ifdef DEBUG` | |
| #ifndef | 如果宏未定义则编译后续代码(常用于头文件保护) | #ifndef HEADER_H | | `#ifndef` | 如果宏未定义则编译后续代码(常用于头文件保护) | `#ifndef HEADER_H` | |
| #if | 条件编译可配合defined操作符使用 | #if VERSION > 2 | | `#if` | 条件编译可配合defined操作符使用 | `#if VERSION > 2` | |
| #else | #if | #ifdef WIN32 | | `#else` | `#if` | `#ifdef WIN32` | |
| #elif | 类似于else if | #if defined(UNIX) | | `#elif` | 类似于else if | `#if defined(UNIX)` | |
| #endif | 结束条件编译块 | 如上例所示 | | `#endif` | 结束条件编译块 | 如上例所示 | |
| #error | 产生编译错误并输出消息 | #if !defined(C99) | | `#error` | 产生编译错误并输出消息 | `#if !defined(C99)` | |
| #pragma | 编译器特定指令(非标准,各编译器不同) | #pragma once | | `#pragma` | 编译器特定指令(非标准,各编译器不同) | `#pragma once` | |
- 基本语法 - 基本语法
@@ -214,7 +214,7 @@ int main()
} }
``` ```
直观上看,无论 y 的取值是多少,表达式 y==200?888:999 的值一定比 x 要大,但由于宏定义仅仅是文本替换,中间不涉及任何运算,因此等价于: 直观上看,无论 y 的取值是多少,表达式 `y==200?888:999` 的值一定比 x 要大,但由于宏定义仅仅是文本替换,中间不涉及任何运算,因此等价于:
```c ```c
printf("最大值:%d\n", x>y==200?888:999 ? x : y==200?888:999); printf("最大值:%d\n", x>y==200?888:999 ? x : y==200?888:999);
@@ -476,11 +476,11 @@ int main(int argc, char *argv[])
- 总结: - 总结:
- #ifdef#ifndef此种形式,判定的是宏是否已被定义,这不要求宏有值。 - `#ifdef``#ifndef`此种形式,判定的是宏是否已被定义,这不要求宏有值。
- #if#elif 这些形式,判定的是宏的值是否为真,这要求宏必须有值。 - `#if``#elif` 这些形式,判定的是宏的值是否为真,这要求宏必须有值。
- #ifdef#ifndef#if结尾需要添加#endif表示结束条件,用以包裹代码块选择那一部分代码参与编译。 - `#ifdef``#ifndef``#if`结尾需要添加`#endif`表示结束条件,用以包裹代码块选择那一部分代码参与编译。
### **条件编译的使用场景** ### **条件编译的使用场景**
@@ -714,9 +714,9 @@ union attr // 6联合体的定义
- 特别说明: - 特别说明:
1. 全局变量、普通函数的定义一般出现在某个源文件(*.c )中,其他的源文件想要使用都需要进行声明(extern),因此一般放在头文件中更方便。 1. 全局变量、普通函数的定义一般出现在某个源文件(`*.c` )中,其他的源文件想要使用都需要进行声明(extern),因此一般放在头文件中更方便。
1. 静态函数、宏定义、结构体、联合体的定义都只能在其所在的文件可见,因此如果多个源文件都需要使用的话,放到头文件中定义是最方便,也是最安全的选择。 2. 静态函数、宏定义、结构体、联合体的定义都只能在其所在的文件可见,因此如果多个源文件都需要使用的话,放到头文件中定义是最方便,也是最安全的选择。
### **头文件的使用** ### **头文件的使用**
@@ -741,7 +741,7 @@ int main()
### **头文件的格式** ### **头文件的格式**
由于头文件包含指令 #include 的本质是复制粘贴,并且一个头文件中可以嵌套包含其他头文件,因此很容易出现一种情况是:头文件被重复包含。 由于头文件包含指令 `#include` 的本质是复制粘贴,并且一个头文件中可以嵌套包含其他头文件,因此很容易出现一种情况是:头文件被重复包含。
- 使用条件编译,解决头文件重复包含的问题,格式如下: - 使用条件编译,解决头文件重复包含的问题,格式如下:
@@ -776,7 +776,7 @@ gec@ubuntu:~/pro$ gcc main.c -o main -I /home/gec/pro/inc
- 语法要点: - 语法要点:
- 预处理指令 #include 的本质是复制粘贴:将指定头文件的内容复制到源码文件中。 - 预处理指令 `#include` 的本质是复制粘贴:将指定头文件的内容复制到源码文件中。
- 系统标准头文件路径可以通过编译选项 -v 来获知,比如: - 系统标准头文件路径可以通过编译选项 -v 来获知,比如:
@@ -797,7 +797,7 @@ gec@ubuntu:~/pro$ gcc main.c -I /home/gec/pro/inc -v
![](images/WEBRESOURCEcb03335b039dd3101bd1e33868113656image.png) ![](images/WEBRESOURCEcb03335b039dd3101bd1e33868113656image.png)
**注意:*是通配符表示将src目录下的所有以.c结尾的文件都参与编译** **注意:`*`是通配符表示将src目录下的所有以.c结尾的文件都参与编译**
![](images/WEBRESOURCE54710c7a76c34ce186adf7550689b814image.png) ![](images/WEBRESOURCE54710c7a76c34ce186adf7550689b814image.png)