From 4ff1cb1a943d9441bf71f08ca2bb56736c298682 Mon Sep 17 00:00:00 2001 From: AxiBright Date: Thu, 22 Jan 2026 20:49:01 +0800 Subject: [PATCH] vault backup: 2026-01-22 20:49:01 --- .obsidian/hotkeys.json | 10 +- .obsidian/workspace.json | 51 +++---- .../YoudaoyunNotes/02C语言/02-C语言入门.md | 124 +++++++++--------- .../02C语言/03-数据类型及IO流.md | 14 +- .../YoudaoyunNotes/02C语言/04-运算符.md | 94 ++++++------- .../02C语言/14-预处理与文件组织.md | 44 +++---- 6 files changed, 175 insertions(+), 162 deletions(-) diff --git a/.obsidian/hotkeys.json b/.obsidian/hotkeys.json index ddf415a..6fc881e 100644 --- a/.obsidian/hotkeys.json +++ b/.obsidian/hotkeys.json @@ -8,5 +8,13 @@ "key": "D" } ], - "templater-obsidian:jump-to-next-cursor-location": [] + "templater-obsidian:jump-to-next-cursor-location": [], + "editor:toggle-code": [ + { + "modifiers": [ + "Mod" + ], + "key": "`" + } + ] } \ No newline at end of file diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 28d7e8a..867baba 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -11,10 +11,15 @@ "id": "53c9f5efa5aa3efd", "type": "leaf", "state": { - "type": "empty", - "state": {}, + "type": "markdown", + "state": { + "file": "Collection/YoudaoyunNotes/02C语言/02-C语言入门.md", + "mode": "source", + "source": false, + "backlinks": false + }, "icon": "lucide-file", - "title": "新标签页" + "title": "02-C语言入门" } } ] @@ -84,12 +89,13 @@ "state": { "type": "outline", "state": { + "file": "Collection/YoudaoyunNotes/02C语言/02-C语言入门.md", "followCursor": true, "showSearch": false, "searchQuery": "" }, "icon": "lucide-list", - "title": "大纲" + "title": "02-C语言入门 的大纲" } }, { @@ -241,8 +247,25 @@ "publish:发布更改": false } }, - "active": "5e96455aab22a229", + "active": "b1cf03bb19fff71c", "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", "Collection/YoudaoyunNotes/02C语言/images/WEBRESOURCEf9401753ae5405e97b73dbc1662bfc9001416f17412c415232ef6faf014cdff5.png", "Collection/YoudaoyunNotes/02C语言/images/WEBRESOURCEfb6a239bed5b462a85fa7ec4382c92210d7713ba345e0119c37b9a76eb31bf65.png", @@ -262,24 +285,7 @@ "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCEa2d88b6292b52c177b4bc6323a5bdd07函数作业题.docx", "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCE94606765850c0696e801236ba49014a2函数练习题.docx", "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCE757c8acbaa371ecec8cc55fab8756448运算符测试.docx", - "Collection/YoudaoyunNotes/02C语言/attachments/WEBRESOURCE40a76a7d230733292ec04717f3f6f254编程规范.pdf", "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基础/05_网络配置.md", "Collection/YoudaoyunNotes/01Linux基础/04_命令行编辑与编译.md", @@ -288,7 +294,6 @@ "Collection/YoudaoyunNotes/01Linux基础/01-开发环境安装.md", "Collection/YoudaoyunNotes/01Linux基础/00-简介.md", "Collection/CQ2605/02C语言/[01-拓展]printf输出颜色与字体控制.md", - "Collection/CQ2605/02C语言/15-静态库与动态库.md", "YueQian/Homework/未命名.canvas", "Excalidraw/未命名.canvas", "未命名.canvas" diff --git a/Collection/YoudaoyunNotes/02C语言/02-C语言入门.md b/Collection/YoudaoyunNotes/02C语言/02-C语言入门.md index c0f5fe1..19c9b04 100644 --- a/Collection/YoudaoyunNotes/02C语言/02-C语言入门.md +++ b/Collection/YoudaoyunNotes/02C语言/02-C语言入门.md @@ -8,15 +8,15 @@ C语言程序源码文件以.c结尾,一个C语言程序主要包括以下部 | 指令 | 说明 | | -- | -- | -| #include | 包含(引入)一个源代码文件 | -| #define | 定义一个宏 | -| #undef | 取消已定义的宏 | -| #if | 如果给定条件为真,则编译其后的代码 | -| #ifdef | 如果宏已经定义,则编译其后的代码 | -| #ifndef | 如果宏没有定义,则编译其后的代码 | -| #elif | 如果前面的 #if 给定条件为假,并且当前条件为真,则编译其后的代码 | -| #endif | 结束一个 #if、#ifdef 或者 #ifndef 条件编译块 | -| #defined | 这不是命令,而是操作符,用来判断某个宏是否已被定义。 | +| `#include` | 包含(引入)一个源代码文件 | +| `#define` | 定义一个宏 | +| `#undef` | 取消已定义的宏 | +| `#if` | 如果给定条件为真,则编译其后的代码 | +| `#ifdef` | 如果宏已经定义,则编译其后的代码 | +| `#ifndef` | 如果宏没有定义,则编译其后的代码 | +| `#elif` | 如果前面的 `#if` 给定条件为假,并且当前条件为真,则编译其后的代码 | +| `#endif` | 结束一个 `#if`、`#ifdef` 或者 `#ifndef` 条件编译块 | +| `#defined` | 这不是命令,而是操作符,用来判断某个宏是否已被定义。 | - 主函数:main函数 --> C语言程序的入口,一个C语言程序有且仅有一个主函数(main) @@ -25,7 +25,7 @@ C语言程序源码文件以.c结尾,一个C语言程序主要包括以下部 - 语句及表达式:语句以英文分号;结尾,if(....)表达式等等 -- 注释:语句或表达式的解释,单行(//)和多行(/* */) +- 注释:语句或表达式的解释,单行(`//`)和多行(`/* */`) 1. **C语言的语法** @@ -39,11 +39,11 @@ C语言程序源码文件以.c结尾,一个C语言程序主要包括以下部 - 常量(Constants):数值不能修改的量 -- 字符串值(String Literals):"" +- 字符串值(String Literals):`""` -- 运算符(Operators): +、-、*、/..... +- 运算符(Operators): `+、-、*、/.....` -- 分隔符(Separators): ; +- 分隔符(Separators): `;` 1. 分号; @@ -51,11 +51,11 @@ C语言程序源码文件以.c结尾,一个C语言程序主要包括以下部 1. 注释 -在C语言程序中,注释用于说明语句或程序的功能和使用方法,注释的语句不会参与到程序的运行只用于开发人员或 使用人员进行查阅C语言程序,注释的方式有单行(// )和多行(/* */)两种。注释不能嵌套使用。 +在C语言程序中,注释用于说明语句或程序的功能和使用方法,注释的语句不会参与到程序的运行只用于开发人员或 使用人员进行查阅C语言程序,注释的方式有单行(`//` )和多行(`/* */`)两种。注释不能嵌套使用。 单行注释: // 需要注释的内容 -多行注释:/* 需要注释的内容 */ +多行注释:`/* 需要注释的内容 */` 1. 标识符 @@ -75,59 +75,59 @@ abc(√) 123(×) _123(√) a&b(×) Ace(√) int(×) 在C语言程序中具有特殊功能或含义的单词,函数名、变量名、常量名及其他用户标识符不能是关键字 -| 关键字 | 说明 | -| -- | -- | -| auto | 声明自动变量 | -| break | 跳出当前循环 | -| case | 开关语句分支 | -| char | 声明字符型变量或函数返回值类型 | -| const | 定义常量,如果一个变量被 const 修饰,那么它的值就不能再被改变 | -| continue | 结束当前循环,开始下一轮循环 | -| default | 开关语句中的"其它"分支 | -| do | 循环语句的循环体 | -| double | 声明双精度浮点型变量或函数返回值类型 | -| else | 条件语句否定分支(与 if 连用) | -| enum | 声明枚举类型 | -| extern | 声明变量或函数是在其它文件或本文件的其他位置定义 | -| float | 声明浮点型变量或函数返回值类型 | -| for | 一种循环语句 | -| goto | 无条件跳转语句 | -| if | 条件语句 | -| int | 声明整型变量或函数 | -| long | 声明长整型变量或函数返回值类型 | -| register | 声明寄存器变量 | -| return | 子程序返回语句(可以带参数,也可不带参数) | -| short | 声明短整型变量或函数 | -| signed | 声明有符号类型变量或函数 | -| sizeof | 计算数据类型或变量长度(即所占内存字节数) | -| static | 声明静态变量 | -| struct | 声明结构体类型 | -| switch | 用于开关语句 | -| typedef | 用以给数据类型取别名 | -| unsigned | 声明无符号类型变量或函数 | -| union | 声明共用体类型 | -| void | 声明函数无返回值或无参数,声明无类型指针 | -| volatile | 说明变量在程序执行中可被隐含地改变 | -| while | 循环语句的循环条件 | +| 关键字 | 说明 | +| ---------- | ---------------------------------- | +| `auto` | 声明自动变量 | +| `break` | 跳出当前循环 | +| `case` | 开关语句分支 | +| `char` | 声明字符型变量或函数返回值类型 | +| `const` | 定义常量,如果一个变量被 const 修饰,那么它的值就不能再被改变 | +| `continue` | 结束当前循环,开始下一轮循环 | +| `default` | 开关语句中的"其它"分支 | +| `do` | 循环语句的循环体 | +| `double` | 声明双精度浮点型变量或函数返回值类型 | +| `else` | 条件语句否定分支(与 if 连用) | +| `enum` | 声明枚举类型 | +| `extern` | 声明变量或函数是在其它文件或本文件的其他位置定义 | +| `float` | 声明浮点型变量或函数返回值类型 | +| `for` | 一种循环语句 | +| `goto` | 无条件跳转语句 | +| `if` | 条件语句 | +| `int` | 声明整型变量或函数 | +| `long` | 声明长整型变量或函数返回值类型 | +| `register` | 声明寄存器变量 | +| `return` | 子程序返回语句(可以带参数,也可不带参数) | +| `short` | 声明短整型变量或函数 | +| `signed` | 声明有符号类型变量或函数 | +| `sizeof` | 计算数据类型或变量长度(即所占内存字节数) | +| `static` | 声明静态变量 | +| `struct` | 声明结构体类型 | +| `switch` | 用于开关语句 | +| `typedef` | 用以给数据类型取别名 | +| `unsigned` | 声明无符号类型变量或函数 | +| `union` | 声明共用体类型 | +| `void` | 声明函数无返回值或无参数,声明无类型指针 | +| `volatile` | 说明变量在程序执行中可被隐含地改变 | +| `while` | 循环语句的循环条件 | ### C99 新增关键字 -| _Bool | _Complex | _Imaginary | inline | restrict | +| `_Bool` | `_Complex` | `_Imaginary` | `inline` | `restrict` | ### C11 新增关键字 -| _Alignas | _Alignof | _Atomic | _Generic | _Noreturn | -| -- | -- | -- | -- | -- | -| _Static_assert | _Thread_local | | | | +| `_Alignas` | `_Alignof` | `_Atomic` | `_Generic` | `_Noreturn` | +| ---------------- | --------------- | ------- | -------- | --------- | +| `_Static_assert` | `_Thread_local` | | | | # 二、编程规范 1. 命名方式 -自定义标识符时要做到 +自定义标识符时要做到**见名知意** 变量名:max_number zui_da_zhi maxNumber @@ -135,25 +135,25 @@ abc(√) 123(×) _123(√) a&b(×) Ace(√) int(×) 常见的命名方式: -- 驼峰式 +- ==驼峰式== 以小写或大写字母开头,后面跟大写或小写字母,如myApp,MyName等类似的命名方式 - 匈牙利命名法 -以变量类型的缩写开头,如int iCount; unsigned int uiNum;等 +以变量类型的缩写开头,如`int iCount; unsigned int uiNum;`等 - 帕斯卡命名法 类似与驼峰式命名法,以大写字母开头,如MyApp,MyName等 -- 下划线命名法 +- ==下划线命名法== 在Linux中最常见的命名方式,Linux一些系统库、开源软件等编码中较为常见。 -如char my_name[10];int first_num;等 +如`char my_name[10];int first_num;`等 -1. 缩进 +2. 缩进 在C语言源码中缩进要对齐,代码要有层级体现,最好用 8 个空格缩进,避免用 4 个空格甚至是 2 个空格 @@ -169,15 +169,15 @@ void fun(void) } ``` -1. 空格和空行 +3. 空格和空行 空格和空行也是提高程序可读性的很重要的一方面,谁都不愿意阅读挤在一起的代码, 因此适当的空格和空行能让程序看起来逻辑更加清晰。 -1. 括号 +4. 括号 函数体和循环结构、分支结构等代码块需要用到花括号将其代码括起来,对于函数而言, 在 LINUX 编码风格中,左右花括号分别占用一行,在其他的代码块中,左花括号可以放在 上一行的最右边,右花括号单独占一行(推荐像函数一样左右括号各自单独占一行,使得代码的风格更具一致性)。 -1. 注释 +5. 注释 在我们编写程序的时候,如果遇到比较复杂的情形,我们可以在代码中用自然语言添加 一些内容,来辅助我们自己和将来要阅读该程序的人员更好地理解程序。 diff --git a/Collection/YoudaoyunNotes/02C语言/03-数据类型及IO流.md b/Collection/YoudaoyunNotes/02C语言/03-数据类型及IO流.md index 2bf95e4..6d9c150 100644 --- a/Collection/YoudaoyunNotes/02C语言/03-数据类型及IO流.md +++ b/Collection/YoudaoyunNotes/02C语言/03-数据类型及IO流.md @@ -681,13 +681,13 @@ float x = a + b - (int)c;// 在该表达式中a将隐士的转换为int类型, - 数据类型的典型大小: -| 数据类型 | 16 位平台(字节) | 32 位平台(字节) | 64 位平台(字节) | 说明 | -| -- | -- | -- | -- | -- | -| char | 1 | 1 | 1 | 始终为 1 字节(8 位),用于存储字符或小整数 | -| short | 2 | 2 | 2 | 至少 2 字节,通常固定为 2 字节(16 位) | -| int | 2 | 4 | 4 | 与平台 “字长” 相关,16 位平台为 2 字节,32/64 位平台通常为 4 字节(但不绝对) | -| long | 4 | 4 | 8 | 32 位平台与 | -| long long | 8 | 8 | 8 | C99 标准引入,固定为 8 字节(64 位),用于表示更大范围的整数 | +| 数据类型 | 16 位平台(字节) | 32 位平台(字节) | 64 位平台(字节) | 说明 | | +| --------- | ---------- | ---------- | ---------- | ------------------------------------------------ | --- | +| char | 1 | 1 | 1 | 始终为 1 字节(8 位),用于存储字符或小整数 | | +| short | 2 | 2 | 2 | 至少 2 字节,通常固定为 2 字节(16 位) | | +| int | 2 | 4 | 4 | 与平台 “字长” 相关,16 位平台为 2 字节,32/64 位平台通常为 4 字节(但不绝对) | | +| long | 4 | 4 | 8 | 32 位平台与 | | +| long long | 8 | 8 | 8 | C99 标准引入,固定为 8 字节(64 位),用于表示更大范围的整数 | | - 可移植整型关键:typedef diff --git a/Collection/YoudaoyunNotes/02C语言/04-运算符.md b/Collection/YoudaoyunNotes/02C语言/04-运算符.md index 939c246..95d1c12 100644 --- a/Collection/YoudaoyunNotes/02C语言/04-运算符.md +++ b/Collection/YoudaoyunNotes/02C语言/04-运算符.md @@ -83,7 +83,7 @@ printf("b=%d\n", ++b); // 前缀先加后用 11 - 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) @@ -265,52 +265,52 @@ int x = (a++,b++,a+b); // 需要使用括号包含,因为,运算符的优先 # 七、运算符优先级 -| 优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 | -| -- | -- | -- | -- | -- | -- | -| 1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | -- | -| () | 圆括号 | (表达式)/函数名(形参表) | -| . | 成员选择(对象) | 对象.成员名 | -| -> | 成员选择(指针) | 对象指针->成员名 | -| 2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 | -| ~ | 按位取反运算符 | ~表达式 | -| ++ | 自增运算符 | ++变量名/变量名++ | -| -- | 自减运算符 | --变量名/变量名-- | -| * | 取值运算符 | *指针变量 | -| & | 取地址运算符 | &变量名 | -| ! | 逻辑非运算符 | !表达式 | -| (类型) | 强制类型转换 | (数据类型)表达式 | -- | -| sizeof | 长度运算符 | sizeof(表达式) | -| 3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 | -| * | 乘 | 表达式*表达式 | -| % | 余数(取模) | 整型表达式%整型表达式 | -| 4 | + | 加 | 表达式+表达式 | 左到右 | -| - | 减 | 表达式-表达式 | -| 5 | <<  | 左移 | 变量<<表达式 | 左到右 | -| >>  | 右移 | 变量>>表达式 | -| 6 | >  | 大于 | 表达式>表达式 | 左到右 | -| >= | 大于等于 | 表达式>=表达式 | -| <  | 小于 | 表达式<表达式 | -| <= | 小于等于 | 表达式<=表达式 | -| 7 | == | 等于 | 表达式==表达式 | 左到右 | -| != | 不等于 | 表达式!= 表达式 | -| 8 | & | 按位与 | 表达式&表达式 | 左到右 | -| 9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | -| 10 | | | 按位或 | 表达式|表达式 | 左到右 | -| 11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | -| 12 | || | 逻辑或 | 表达式||表达式 | 左到右 | -| 13 | ?: | 条件运算符 | 表达式1? | 右到左 | 三目运算符 | -| 14 | = | 赋值运算符 | 变量=表达式 | 右到左 | -- | -| /= | 除后赋值 | 变量/=表达式 | -| *= | 乘后赋值 | 变量*=表达式 | -| %= | 取模后赋值 | 变量%=表达式 | -| += | 加后赋值 | 变量+=表达式 | -| -= | 减后赋值 | 变量-=表达式 | -| <<= | 左移后赋值 | 变量<<=表达式 | -| >>= | 右移后赋值 | 变量>>=表达式 | -| &= | 按位与后赋值 | 变量&=表达式 | -| ^= | 按位异或后赋值 | 变量^=表达式 | -| |= | 按位或后赋值 | 变量|=表达式 | -| 15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | 从左到右顺序运算 | +| 优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 | | | | | +| ------ | -------- | -------------- | ---------- | ---- | -------- | --- | --- | --- | --- | +| 1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | -- | | | | | +| () | 圆括号 | (表达式)/函数名(形参表) | | | | | | | | +| . | 成员选择(对象) | 对象.成员名 | | | | | | | | +| -> | 成员选择(指针) | 对象指针->成员名 | | | | | | | | +| 2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 | | | | | +| ~ | 按位取反运算符 | ~表达式 | | | | | | | | +| ++ | 自增运算符 | ++变量名/变量名++ | | | | | | | | +| -- | 自减运算符 | --变量名/变量名-- | | | | | | | | +| * | 取值运算符 | *指针变量 | | | | | | | | +| & | 取地址运算符 | &变量名 | | | | | | | | +| ! | 逻辑非运算符 | !表达式 | | | | | | | | +| (类型) | 强制类型转换 | (数据类型)表达式 | -- | | | | | | | +| sizeof | 长度运算符 | sizeof(表达式) | | | | | | | | +| 3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 | | | | | +| * | 乘 | 表达式*表达式 | | | | | | | | +| % | 余数(取模) | 整型表达式%整型表达式 | | | | | | | | +| 4 | + | 加 | 表达式+表达式 | 左到右 | | | | | | +| - | 减 | 表达式-表达式 | | | | | | | | +| 5 | <<  | 左移 | 变量<<表达式 | 左到右 | | | | | | +| >>  | 右移 | 变量>>表达式 | | | | | | | | +| 6 | >  | 大于 | 表达式>表达式 | 左到右 | | | | | | +| >= | 大于等于 | 表达式>=表达式 | | | | | | | | +| <  | 小于 | 表达式<表达式 | | | | | | | | +| <= | 小于等于 | 表达式<=表达式 | | | | | | | | +| 7 | == | 等于 | 表达式==表达式 | 左到右 | | | | | | +| != | 不等于 | 表达式!= 表达式 | | | | | | | | +| 8 | & | 按位与 | 表达式&表达式 | 左到右 | | | | | | +| 9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | | | | | | +| 10 | | | 按位或 | 表达式 | 表达式 | 左到右 | | | | +| 11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | | | | | | +| 12 | | | | 逻辑或 | 表达式 | | 表达式 | 左到右 | | +| 13 | ?: | 条件运算符 | 表达式1? | 右到左 | 三目运算符 | | | | | +| 14 | = | 赋值运算符 | 变量=表达式 | 右到左 | -- | | | | | +| /= | 除后赋值 | 变量/=表达式 | | | | | | | | +| *= | 乘后赋值 | 变量*=表达式 | | | | | | | | +| %= | 取模后赋值 | 变量%=表达式 | | | | | | | | +| += | 加后赋值 | 变量+=表达式 | | | | | | | | +| -= | 减后赋值 | 变量-=表达式 | | | | | | | | +| <<= | 左移后赋值 | 变量<<=表达式 | | | | | | | | +| >>= | 右移后赋值 | 变量>>=表达式 | | | | | | | | +| &= | 按位与后赋值 | 变量&=表达式 | | | | | | | | +| ^= | 按位异或后赋值 | 变量^=表达式 | | | | | | | | +| | = | 按位或后赋值 | 变量 | =表达式 | | | | | | +| 15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | 从左到右顺序运算 | | | | | 记忆办法:去掉一个最高优先级括号(),去掉两个最低优先级赋值和逗号 diff --git a/Collection/YoudaoyunNotes/02C语言/14-预处理与文件组织.md b/Collection/YoudaoyunNotes/02C语言/14-预处理与文件组织.md index 23945f4..f70bc3e 100644 --- a/Collection/YoudaoyunNotes/02C语言/14-预处理与文件组织.md +++ b/Collection/YoudaoyunNotes/02C语言/14-预处理与文件组织.md @@ -77,19 +77,19 @@ gcc hello.o -o hello 1. 向编译器传送特定指令:#progma -| 指令 | 描述 | 使用示例 | -| -- | -- | -- | -| #define | 定义宏(符号常量或函数式宏) | #define PI 3.14159 | -| #include | 包含头文件 | #include | -| #undef | 取消已定义的宏 | #undef PI | -| #ifdef | 如果宏已定义则编译后续代码 | #ifdef DEBUG | -| #ifndef | 如果宏未定义则编译后续代码(常用于头文件保护) | #ifndef HEADER_H | -| #if | 条件编译(可配合defined操作符使用) | #if VERSION > 2 | -| #else | #if | #ifdef WIN32 | -| #elif | 类似于else if | #if defined(UNIX) | -| #endif | 结束条件编译块 | 如上例所示 | -| #error | 产生编译错误并输出消息 | #if !defined(C99) | -| #pragma | 编译器特定指令(非标准,各编译器不同) | #pragma once | +| 指令 | 描述 | 使用示例 | | +| ---------- | ----------------------- | ------------------- | --- | +| `#define` | 定义宏(符号常量或函数式宏) | `#define PI 3.14159` | | +| `#include` | 包含头文件 | `#include ` | | +| `#undef` | 取消已定义的宏 | `#undef PI` | | +| `#ifdef` | 如果宏已定义则编译后续代码 | `#ifdef DEBUG` | | +| `#ifndef` | 如果宏未定义则编译后续代码(常用于头文件保护) | `#ifndef HEADER_H` | | +| `#if` | 条件编译(可配合defined操作符使用) | `#if VERSION > 2` | | +| `#else` | `#if` | `#ifdef WIN32` | | +| `#elif` | 类似于else if | `#if defined(UNIX)` | | +| `#endif` | 结束条件编译块 | 如上例所示 | | +| `#error` | 产生编译错误并输出消息 | `#if !defined(C99)` | | +| `#pragma` | 编译器特定指令(非标准,各编译器不同) | `#pragma once` | | - 基本语法 @@ -214,7 +214,7 @@ int main() } ``` -直观上看,无论 y 的取值是多少,表达式 y==200?888:999 的值一定比 x 要大,但由于宏定义仅仅是文本替换,中间不涉及任何运算,因此等价于: +直观上看,无论 y 的取值是多少,表达式 `y==200?888:999` 的值一定比 x 要大,但由于宏定义仅仅是文本替换,中间不涉及任何运算,因此等价于: ```c 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 来获知,比如: @@ -797,7 +797,7 @@ gec@ubuntu:~/pro$ gcc main.c -I /home/gec/pro/inc -v ![](images/WEBRESOURCEcb03335b039dd3101bd1e33868113656image.png) -**注意:*是通配符,表示将src目录下的所有以.c结尾的文件都参与编译** +**注意:`*`是通配符,表示将src目录下的所有以.c结尾的文件都参与编译** ![](images/WEBRESOURCE54710c7a76c34ce186adf7550689b814image.png)