Zig 基本语法

简介: Zig 基本语法

Zig 是一种新的编程语言,设计简单、高效,并且直接与 C 语言兼容。

下面是一些 Zig 的基本语法介绍,帮助你快速上手。

Zig 代码文件的后缀名为 .zig


第一个 Zig 程序

我们先来看看 Zig 的 "Hello, World!" 程序。

我们先来初始化一个 zig 项目:

mkdir hello-world

cd hello-world

zig init

然后在该项目下创建 hello.zig 文件,代码如下:

实例(hello.zig 文件)

const std = @import("std");


pub fn main() void {

   const stdout = std.io.getStdOut().writer();

   stdout.print("Hello, World!\n", .{}) catch {};

}

代码解析:

1、导入标准库:

const std = @import("std");

这行代码导入了 Zig 的标准库,类似于 C 语言中的 #include <stdio.h>。

2、定义 main 函数:

pub fn main() void {

这是程序的入口点。

pub 关键字表示这个函数是公开的,fn 关键字用于定义函数,main 是函数名,() void 表示这个函数不接受任何参数,并且返回类型是 void(无返回值)。

3、获取标准输出:

const stdout = std.io.getStdOut().writer();

这行代码获取标准输出(通常是终端),并将其转换为一个写入器(writer())。

4、打印 "Hello, World!":

stdout.print("Hello, World!\n", .{}) catch {};

使用 print 方法将字符串 "Hello, World!\n" 写入标准输出。

.{} 是一个空的关联数组,用于传递可选参数。

catch 关键字用于捕获并处理可能发生的异常,这里简单地将其忽略。

5、错误处理:

catch {};

catch 关键字用于捕获并处理可能发生的异常。

在这里,我们只是简单地捕获它,但没有做任何处理({} 表示空的代码块)。

这个程序非常简单,但它展示了 Zig 语言的一些基本特性,比如函数定义、标准库的使用、异常处理等。要运行这个程序,你需要安装 Zig 编译器,然后使用以下命令:

zig build-exe hello.zig

这会生成一个可执行文件(通常是 hello),你可以通过运行它来查看输出。

在终端中运行编译后的脚本:

./hello

这将输出 "Hello, World!"。

标识符

在 Zig 语言中,标识符是用来命名变量、函数、类型等的名称。

以下是一些关于 Zig 标识符的规则和特性:

  1. 字母和数字:标识符可以包含字母(A-Z 和 a-z)、数字(0-9)和下划线(_)。
  2. 开头字符:标识符必须以字母或下划线开头,不能以数字开头。
  3. 大小写敏感:Zig 是一种区分大小写的语言,这意味着 Variablevariable 是两个不同的标识符。
  4. 关键字和保留字:一些特定的单词在 Zig 中是保留的,不能用作标识符。例如 fn(函数)、struct(结构体)、if(条件语句)等。
  5. 命名约定
  • 驼峰命名法:通常使用驼峰命名法来命名标识符。例如,函数名 calculateSum,类型名 Person
  • 下划线命名法:在一些情况下,尤其是在与 C 语言交互时,可能需要使用下划线命名法。例如 calculate_sum
  1. 可选类型:Zig 语言中有一个特殊的类型 ?T,表示一个类型为 T 的可选值。这在处理可能为空的值时非常有用。
  2. 编译时常量:在标识符前使用 comptime 关键字,可以表示该标识符是一个编译时常量。
  3. 错误类型:使用 error 关键字可以定义错误类型,例如:

pub fn openFile(path: []const u8) !void {

   // ...

}

  1. 类型后缀:在类型名称后使用 _t 后缀是 C 语言的习惯,在 Zig 中也可以这样做,但不是必需的。

保留关键词

以下是 Zig 语言的一些保留关键词:

Keywords Description
align 指定变量或类型对齐字节数
allowzero 允许指针指向空值
and 逻辑与操作
asm 内联汇编块
async 异步函数声明
await 等待异步操作完成
break 跳出最近的循环或作用域
callconv 调用约定
const 定义常量
continue 继续下一次循环迭代
defer 延迟执行语句,直到作用域退出
else 条件语句的否定分支
enum 枚举类型
errdefer 错误发生时的延迟执行语句
error 错误类型定义
export 导出符号
fn 函数定义
for 遍历循环
if 条件语句
inline 内联函数
linksection 指定链接器的节
noalias 指针不能被其他指针别名
noasync 禁止函数内使用 await
noinline 阻止函数内联
null 空值
or 逻辑或操作
packed 取消结构体填充
pub 公开(public)访问级别
return 从函数返回
struct 结构体类型定义
suspend 异步函数的挂起点
switch 多路分支选择语句
test 测试代码块
threadlocal 线程局部变量
try 尝试执行表达式,可能产生错误
union 联合体类型定义
usingnamespace 使用指定的命名空间
var 定义变量
void 无类型,常用于函数无返回值
while 循环语句

基本语法

1. 变量与常量

在 Zig 中,变量使用 var 关键字定义,常量使用 const 关键字定义。

const x: i32 = 10; // 定义一个整数常量 x,值为 10

var y: f64 = 3.14; // 定义一个浮点数变量 y,值为 3.14

2. 函数

函数使用 fn 关键字定义,并指定返回类型。

const std = @import("std");


fn add(a: i32, b: i32) i32 {

   return a + b;

}


pub fn main() void {

   const result = add(3, 4);

   std.debug.print("Result: {}\n", .{result});

}

3. 条件语句

使用 if 和 else 来实现条件逻辑。

const std = @import("std");


pub fn main() void {

   const number = 10;

   if (number > 0) {

       std.debug.print("Number is positive\n", .{});

   } else {

       std.debug.print("Number is not positive\n", .{});

   }

}

4. 循环

Zig 支持 while 和 for 循环。

const std = @import("std");


pub fn main() void {

   var i: i32 = 0;

   while (i < 5) : (i += 1) {

       std.debug.print("i: {}\n", .{i});

   }


   const array = [5]i32{1, 2, 3, 4, 5};

   for (array) |item| {

       std.debug.print("item: {}\n", .{item});

   }

}

5. 结构体

Zig 使用 struct 来定义结构体。

const std = @import("std");


const Point = struct {

   x: i32,

   y: i32,

};


pub fn main() void {

   const p = Point{ .x = 10, .y = 20 };

   std.debug.print("Point: ({}, {})\n", .{p.x, p.y});

}

6. 错误处理

Zig 使用错误枚举类型和 try 关键字进行错误处理。

const std = @import("std");


const Error = error{

   FileNotFound,

};


fn readFile(path: []const u8) !void {

   // 模拟一个可能失败的操作

   if (path == "invalid") {

       return Error.FileNotFound;

   }

   // 其他操作

}


pub fn main() void {

   if (readFile("invalid") catch |err| switch (err) {

       Error.FileNotFound => {

           std.debug.print("Error: File not found\n", .{});

       },

   }) | _ | {

       std.debug.print("File read successfully\n", .{});

   }

}

目录
相关文章
|
安全 物联网 编译器
Zig 教程
Zig 教程
1130 1
|
Unix 编译器 iOS开发
Zig 环境安装
Zig 环境安装
1114 2
Zig 环境安装
|
自然语言处理 安全 Devops
GitLab 国际站中国大陆等地区停服,如何将数据快速迁移到云效
对于正在使用 GitLab 国际站托管代码的企业和研发团队,除迁移至极狐 GitLab 外,国内其他主流的 DevOps 平台也具有完备的产品能力,为开发者提供了更多的选择。其中,阿里云云效也提供了针对常见代码托管平台如 GitHub、GitLab 简单便捷的迁移方案,帮助用户快速完成核心代码数据的迁移,确保代码资产安全。
|
内存技术
除了智能照明系统,PWM 还可以应用在哪些领域
脉冲宽度调制(PWM)技术不仅适用于智能照明系统,还广泛应用于电机控制、电源管理、音频处理和通信系统等领域,以实现高效能的信号和功率控制。
1409 11
|
机器学习/深度学习 人工智能 自然语言处理
【开源项目】自然语言处理领域的明星项目推荐:Hugging Face Transformers
在当今人工智能与大数据飞速发展的时代,自然语言处理(NLP)已成为推动科技进步的重要力量。而在NLP领域,Hugging Face Transformers无疑是一个备受瞩目的开源项目。本文将从项目介绍、代码解释以及技术特点等角度,为您深入剖析这一热门项目。
563 10
|
JSON 缓存 API
1688 商品详情数据接口(1688.item_get)
1688商品详情数据接口(1688.item_get)由阿里巴巴提供,旨在帮助开发者获取1688网站上的商品详细信息。开发者需先注册并创建应用获取API凭证,随后申请调用权限。接口通过必填与可选参数组合使用,如app_key、timestamp、fields等,以JSON格式返回商品详情,包括ID、名称、价格、库存等信息。
1108 0
|
XML 数据格式 C++
protobuf C++ 使用示例
1、在.proto文件中定义消息格式 2、使用protobuf编译器 3、使用c++ api来读写消息   0、为何使用protobuf?   1、原始内存数据结构,可以以二进制方式sent/saved.这种方式需要相同的内存布局和字节序。
8825 0
|
网络协议 安全 Linux
腾讯三面:一台服务器,最大支持的TCP连接数是多少?
一个 TCP 对象占用的大小,等于它所包含的一些数据结构占用大小的总和,也是就把上面这些数据结构的大小累加起来,就是一个 TCP 连接占用的大小了。实际过程中的 TCP 连接,肯定不是静止状态的,还会进行发送数据和接收数据了,那么这些过程还是会额外消耗更多的内存资源的,8 GB 物理内存的服务器实际并发很难达到百万级别。
1294 2
|
Rust JavaScript 前端开发
Zig
Zig 是一门系统编程语言,旨在提供一种简单、安全且高效的方式来构建软件。它的设计受到了 Rust、C 和 C++ 的影响,但与这些语言相比,Zig 更加简单易用。Zig 的语法和抽象级别使得它易于学习和使用,同时它还提供了许多现代编程语言的功能,如高级类型、模块化编程和内存安全等。
1053 6

热门文章

最新文章