新增了文档目录,并且写了一点第三节

This commit is contained in:
lzy
2024-03-18 14:31:44 +08:00
parent 96ee4eb84e
commit ad3056a8b8
4 changed files with 160 additions and 49 deletions

View File

@@ -1,3 +1,18 @@
# 目录
- [目录](#目录)
- [第二章 数据类型,运算符和表达式](#第二章-数据类型运算符和表达式)
- [数据类型(基本数据类型)](#数据类型基本数据类型)
- [常量与变量](#常量与变量)
- [常量](#常量)
- [定义](#定义)
- [分类](#分类)
- [变量](#变量)
- [定义](#定义-1)
- [变量的生命周期与作用范围](#变量的生命周期与作用范围)
- [运算符和表达式](#运算符和表达式)
- [表达式和语句的区别](#表达式和语句的区别)
- [运算符相关代码](#运算符相关代码)
# 第二章 数据类型,运算符和表达式
## 数据类型(基本数据类型)
@@ -39,8 +54,6 @@
5. 数据类型得与后续代码的输入输入相匹配(自相矛盾)
## 常量与变量
### 常量
@@ -51,14 +64,14 @@
#### 分类
* 整型常量179076
- 整型常量179076
* 实型常量3.145.26
* 字符常量:由单引号引起来的单个字符或转义字符,如`'a'``'X'``'\n'``'\ddd'`d可以是`0-7`,三位八进制,例如`'\015'``'\xhh'`h可以是`0-F`,二位十六进制,`'\x7f'`
* 字符串常量:由双引号引起来的一个或多个字符组成的序列(特殊情况,空串),如:`""``"a"``"abXYZ"``"abc\n\021\018"`(注意这个字符串,`\n``\021`都是算单个字符,`\018`又不算)
- 实型常量3.145.26
- 字符常量:由单引号引起来的单个字符或转义字符,如`'a'``'X'``'\n'``'\ddd'`d可以是`0-7`,三位八进制,例如`'\015'``'\xhh'`h可以是`0-F`,二位十六进制,`'\x7f'`
- 字符串常量:由双引号引起来的一个或多个字符组成的序列(特殊情况,空串),如:`""``"a"``"abXYZ"``"abc\n\021\018"`(注意这个字符串,`\n``\021`都是算单个字符,`\018`又不算)
> 我问gpt"\018"在C语言几个字符。
> 在C语言中字符串是以字符数组的形式表示而每个字符串的末尾都有一个特殊的字符`'\0'`(空字符),用于标识字符串的结束。当你提到的`"\018"`在C语言中出现时它表示一个包含特殊字符的字符串字面量。
> 在C语言中字符串是以字符数组的形式表示而每个字符串的末尾都有一个特殊的字符`'\0'`(空字符),用于标识字符串的结束。当你提到的`"\018"`在C语言中出现时它表示一个包含特殊字符的字符串字面量。
>
> 具体来说,`\0`在C语言中是一个转义字符用于表示字符串的结束符null terminator。该符号用于标记字符串的结束确保字符串处理函数如`printf`、`strcpy`等知道在哪里停止处理。
>
@@ -66,21 +79,21 @@
>
> 总结来说在C语言中`"\018"`实际上会被看作一个包含单一结束字符null terminator的字符串而不是包含多个字符。这种处理方式是因为C语言使用空字符来标记字符串的结束。
* 标识常量:`#define`
- 标识常量:`#define`
特点:完整的用宏体替换宏名,**不做任何检查**。
```c
#include <stdio.h>
#include <stdlib.h>
#define PI 3.14
#define ADD 2 + 3
#define ADD1 (2 + 3)
#define MAX(a, b) (a > b ? a : b)
#define MAX1(a, b) ((a) > (b) ? (a) : (b))
int main()
{
// printf("%d\n", ADD * ADD);
@@ -89,14 +102,14 @@
// printf("%d\n", ADD1 * ADD1);
// 相当于(2+3)*(2+3)
// 正常输出25
int i = 5, j = 3;
// printf("%d\n", MAX(i, j));
// 输出5
// printf("%d\n", MAX(i, j * 2));
// 输出6
printf("i=%d\tj=%d\n", i, j);
printf("%d\n", MAX1(i++, j++));
printf("i=%d\tj=%d\n", i, j);
@@ -107,7 +120,7 @@
// 为什么i自增了两次
// 预处理结果
// printf("%d\n", ((i++) + (j++) ? (i++) : (j++)));
exit(0);
}
```
@@ -123,41 +136,33 @@
int A = a, B = b; \
((A) > (B) ? (A) : (B)); \
})
#define MAX3(a, b) \
({ \
typeof(a) A = a, B = b; \
((A) > (B) ? (A) : (B)); \
})
```
### 变量
用来保存一些特定内容,并且在程序执行过程中值**随时会发生变化**的量。
#### 定义
| [存储类型] | 数据类型 | 标识符 | = | 值 |
| :--------: | :------: | :----: | :--: | :---: |
| | TYPE | NAME | = | VALUE |
* 标识符:由字母,数字,下划线组成且不能以数字开头的一个标识序列。拟定时尽量做到见名知义。
* 数据类型:基本数据类型、构造类型
* 值:注意匹配
* 存储类型:`auto``static``register``extern`(说明型)
* `auto`:默认,自动分配空间,自动回收空间。
* `register`建议型编译器不一定采用寄存器类型只能定义局部变量不能定义全局变量大小有定义只能定义32位大小的数据类型如`double`就不可以;集尘器没有地址,所以一个寄存器类型的变量无法打印出地址查看或使用。
* `static`静态型自动初始化为0值或空值并且变量的值有继承性。另外常用来修饰一个变量和函数防止其对外扩散。
* `extern`:说明型,意味着不能改变被说明的变量的值或类型。
| [存储类型] | 数据类型 | 标识符 | = | 值 |
| :--------: | :------: | :----: | :-: | :---: |
| | TYPE | NAME | = | VALUE |
- 标识符:由字母,数字,下划线组成且不能以数字开头的一个标识序列。拟定时尽量做到见名知义。
- 数据类型:基本数据类型、构造类型
- 值:注意匹配
- 存储类型:`auto``static``register``extern`(说明型)
- `auto`:默认,自动分配空间,自动回收空间。
- `register`建议型编译器不一定采用寄存器类型只能定义局部变量不能定义全局变量大小有定义只能定义32位大小的数据类型如`double`就不可以;集尘器没有地址,所以一个寄存器类型的变量无法打印出地址查看或使用。
- `static`静态型自动初始化为0值或空值并且变量的值有继承性。另外常用来修饰一个变量和函数防止其对外扩散。
- `extern`:说明型,意味着不能改变被说明的变量的值或类型。
```c
#include <stdio.h>
@@ -272,8 +277,6 @@ int main()
}
```
#### 变量的生命周期与作用范围
1. 全局变量和局部变量
@@ -282,7 +285,7 @@ int main()
![存储类型比较](https://s2.loli.net/2024/03/12/y8pMEXS3LBIDAuc.png)
> 这一块具体讲解见代码仓库`/Chapter2/变量/`。
> 这一块具体讲解见代码仓库`/Chapter2/变量/`。
在`minproj`例子中,如果在`proj.c`和`proj.h`中`static`定义`func`函数,而在`main.c`中调用`func`。
@@ -297,27 +300,25 @@ main.c:(.text+0x2f): undefined reference to `func'
collect2: error: ld returned 1 exit status
```
### 运算符和表达式
#### 表达式和语句的区别
* 运算符部分
- 运算符部分
![运算符](https://s2.loli.net/2024/03/12/3MkPpF5anv7eEGu.png)
* 每个运算符所需要的参与运算的操作数个数
- 每个运算符所需要的参与运算的操作数个数
* 结合性
- 结合性
* 优先级
- 优先级
* 运算符的特殊用法
- 运算符的特殊用法
如:`%`(要求左右两边都是整形),`=`与`==`,逻辑运算(`&&`和`||`)的短路特性
* 位运算的重要性
- 位运算的重要性
`<< >> ~ | ^ &`
@@ -445,4 +446,3 @@ int main()
#endif
```