Skip to content

Commit

Permalink
更新零位类型
Browse files Browse the repository at this point in the history
  • Loading branch information
jinzhongjia committed Dec 11, 2023
1 parent 3428a36 commit c8f6f19
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 8 deletions.
1 change: 1 addition & 0 deletions learn/.vitepress/sidebar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ export default [
},
{
text: "零位类型",
link: "/more/zero-type",
},
{
text: "原子操作",
Expand Down
8 changes: 4 additions & 4 deletions learn/basic/basic_type/function.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ pub fn add(a: u8, b: u8) u8 {
}
```

> 如果你有 C++ 的使用经验,一眼就可以看出来各自的作用。
> 如果你有 C 的使用经验,一眼就可以看出来各自的作用。
下面来进行说明:

Expand All @@ -26,7 +26,7 @@ pub fn add(a: u8, b: u8) u8 {
4. `a: u8` 是参数的标识符和类型,这里有两个参数,分别是 `a``b`,它们的类型均是 `u8`
5. `u8` 是函数的返回类型,在 zig 中,一个函数只能返回一个值。

如果没有返回值,请使用 `void`
如果没有返回值,请使用 `void`**_zig 原则上不允许忽略函数的返回值_**,如果需要忽略可将返回值分配给 `_`,编译器将自动忽略该返回值

:::info 🅿️ 提示

Expand All @@ -38,7 +38,7 @@ fn max(comptime T: type, a: T, b: T) T {
}
```

其中的 `comptime T: type` 你可能很陌生,这是编译期参数,它是用来实现鸭子类型(泛型)的关键语法!
其中的 `comptime T: type` 你可能很陌生,这是[编译期](../../advanced/comptime.md)参数,它是用来实现鸭子类型(泛型)的关键语法!

:::

Expand Down Expand Up @@ -66,7 +66,7 @@ zig 在这方面的处理则是,原始类型(整型、布尔这种)传递

像复合类型(结构体、联合、数组等),这些传递均是由编译器来决定究竟是使用“值传递”还是“引用传递”。

但作为开发者,只需要记住,函数的参数是不可变的就行了
但作为开发者,只需要记住,**_函数的参数是不可变的_** 就行了

:::info 🅿️ 提示

Expand Down
8 changes: 4 additions & 4 deletions learn/basic/basic_type/number.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ const permissions = 0o7_5_5;
const big_address = 0xFF80_0000_0000_0000;
```

同时 zig 支持任意位宽的整数,使用u或者i后面加数字即可,例如 `i7` 代表有符号的7位整数,整数类型允许的最大位宽为`65535`
同时 zig 支持任意位宽的整数,使用 `u` 或者 `i` 后面加数字即可,例如 `i7` 代表有符号的7位整数,整数类型允许的最大位宽为`65535`

::: tip 🅿️ 提示
`usize``isize` 这两种类型的的大小取决于,运行程序的目标计算器CPU的类型:32位CPU则两个类型均为32位,64位同理
`usize``isize` 这两种类型的的大小取决于,运行程序的目标计算机 CPU 的类型:32 位 CPU 则两个类型均为 32 位,64 位同理
:::

### 不同进制
Expand All @@ -57,7 +57,7 @@ const big_address = 0xFF80_0000_0000_0000;

zig 编译器对于除零的处理是分别在编译期和运行时(除 `ReleaseSmall` 构建模式外)进行检测,编译时检测出错误则直接停止编译,运行时如果出错会给出完整的堆栈跟踪。

:::details 小细节
::: details 小细节
这里的“除零”包括了 _除法__求余_ 两种操作!
:::

Expand Down Expand Up @@ -158,7 +158,7 @@ zig 中,有以下默认操作可以导致溢出:
::: info 🅿️ 提示
zig 并未像其他语言那样默认提供了NaN、无穷大、负无穷大这些语法,如果需要使用它们,请使用标准库:
zig 并未像其他语言那样默认提供了 NaN、无穷大、负无穷大这些语法,如果需要使用它们,请使用标准库:
```zig
const std = @import("std");
Expand Down
8 changes: 8 additions & 0 deletions learn/basic/define-variable.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,14 @@ pub fn main() void {
}
```

::: info 🅿️ 提示

当前 zig 的 `nightly` 版本不允许使用不会被修改的变量,即尽可能使用常量。

同时,zig 还要求所有的非顶层定义的变量(常量)均被使用,如果未被使用编译器会报告错误,但可通过将其分配给 `_` 来解决此问题。

:::

### 标识符命名

在 zig 中,**_禁止变量覆盖外部作用域_**
Expand Down
45 changes: 45 additions & 0 deletions learn/more/zero-type.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
---
outline: deep
---

# 零位类型

在 zig 中,有一些类型是特殊的零位类型(**Zero Type**),它们的大小是 0 bit。

它们的特点是,涉及到它们的值不会出现在构建结果中(0 bit不占任何空间)。

## `void`

`void` 是很明显的**零位类型**,常用于函数无返回值。

但它不止这一种用法,还可以用来初始化泛型实例,例如 `std.AutoHashMap`

```zig
var map = std.AutoHashMap(i32, void).init(std.testing.allocator);
```

这样就会获得一个 `i32` 的 set,尽管可以使用其他方式来实现集合功能,但这样子实现效果内存占用会更少(因为相当于不存在 value)。

## 整数

[整数](../basic/basic_type/number.md) 声明可以使用 `u0``i0` 来声明**零位整数类型**,它们的大小也是 0 bit。

## 数组和切片

[数组](../basic/advanced_type/array.md)[切片](../basic/advanced_type/silce.md) 的长度为 0 时,就是**零位类型**

另外,如果它们的元素类型是零位类型,则它们必定是**零位类型**,此时与数组(切片)长度无关。

## 枚举

只有一个值的 [枚举](../basic/advanced_type/enum.md),也是**零位类型**

## 结构体

[结构体](../basic/advanced_type/struct.md) 为空或者字段均为零位类型时,此时结构体也是**零位类型**

例如,`const zero = struct {};` 就是一个零位类型,它的大小为 0。

## 联合类型

仅具有一种可能类型(且该类型是零位类型)的 [联合类型](../basic/union.md) 也是零位类型。

0 comments on commit c8f6f19

Please sign in to comment.