vault backup: 2026-01-22 20:49:01
This commit is contained in:
10
.obsidian/hotkeys.json
vendored
10
.obsidian/hotkeys.json
vendored
@@ -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": "`"
|
||||
}
|
||||
]
|
||||
}
|
||||
51
.obsidian/workspace.json
vendored
51
.obsidian/workspace.json
vendored
@@ -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"
|
||||
|
||||
@@ -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. 注释
|
||||
|
||||
在我们编写程序的时候,如果遇到比较复杂的情形,我们可以在代码中用自然语言添加 一些内容,来辅助我们自己和将来要阅读该程序的人员更好地理解程序。
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | 从左到右顺序运算 | | | | |
|
||||
|
||||
|
||||
记忆办法:去掉一个最高优先级括号(),去掉两个最低优先级赋值和逗号
|
||||
|
||||
@@ -77,19 +77,19 @@ gcc hello.o -o hello
|
||||
|
||||
1. 向编译器传送特定指令:#progma
|
||||
|
||||
| 指令 | 描述 | 使用示例 |
|
||||
| -- | -- | -- |
|
||||
| #define | 定义宏(符号常量或函数式宏) | #define PI 3.14159 |
|
||||
| #include | 包含头文件 | #include <stdio.h> |
|
||||
| #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 <stdio.h>` | |
|
||||
| `#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
|
||||
|
||||

|
||||
|
||||
**注意:*是通配符,表示将src目录下的所有以.c结尾的文件都参与编译**
|
||||
**注意:`*`是通配符,表示将src目录下的所有以.c结尾的文件都参与编译**
|
||||
|
||||

|
||||
|
||||
|
||||
Reference in New Issue
Block a user