首页 > 其他分享 >zig 函数

zig 函数

时间:2025-01-17 15:04:36浏览次数:3  
标签:std const 函数 i32 pub zig return fn

第四章:函数

4.1 函数定义和调用

基本函数定义

const std = @import("std");

// 基本函数定义
pub fn add(a: i32, b: i32) i32 {
    return a + b;
}

// 无返回值的函数
pub fn printMessage(message: []const u8) void {
    std.debug.print("{s}\n", .{message});
}

pub fn main() void {
    const result = add(5, 3);
    printMessage("结果是: ");
    std.debug.print("{d}\n", .{result});
}

函数文档注释

/// 计算两个数的和
/// 参数:
///   a: 第一个加数
///   b: 第二个加数
/// 返回: 两个数的和
pub fn add(a: i32, b: i32) i32 {
    return a + b;
}

4.2 参数传递

值传递

pub fn increment(x: i32) i32 {
    return x + 1;
}

pub fn main() void {
    const a = 5;
    const b = increment(a);
    // a 仍然是 5,b 是 6
}

指针参数

pub fn incrementPtr(x: *i32) void {
    x.* += 1;
}

pub fn main() void {
    var a: i32 = 5;
    incrementPtr(&a);
    // a 现在是 6
}

切片参数

pub fn sum(numbers: []const i32) i32 {
    var total: i32 = 0;
    for (numbers) |number| {
        total += number;
    }
    return total;
}

pub fn main() void {
    const numbers = [_]i32{ 1, 2, 3, 4, 5 };
    const result = sum(&numbers);
    std.debug.print("总和: {d}\n", .{result});
}

4.3 返回值

多返回值

pub fn divMod(a: i32, b: i32) struct { quotient: i32, remainder: i32 } {
    return .{
        .quotient = @divFloor(a, b),
        .remainder = @mod(a, b),
    };
}

pub fn main() void {
    const result = divMod(10, 3);
    std.debug.print("商: {d}, 余数: {d}\n", .{
        result.quotient,
        result.remainder,
    });
}

可选返回值

pub fn findFirst(numbers: []const i32, target: i32) ?usize {
    for (numbers, 0..) |number, index| {
        if (number == target) return index;
    }
    return null;
}

pub fn main() void {
    const numbers = [_]i32{ 1, 2, 3, 4, 5 };
    if (findFirst(&numbers, 3)) |index| {
        std.debug.print("找到数字在索引: {d}\n", .{index});
    } else {
        std.debug.print("未找到数字\n", .{});
    }
}

4.4 错误处理机制

定义错误集

const MathError = error{
    DivisionByZero,
    Overflow,
};

pub fn divide(a: i32, b: i32) MathError!i32 {
    if (b == 0) return MathError.DivisionByZero;
    if (a == std.math.minInt(i32) and b == -1) {
        return MathError.Overflow;
    }
    return @divFloor(a, b);
}

错误处理

pub fn main() !void {
    // 使用 try
    const result1 = try divide(10, 2);
    std.debug.print("结果1: {d}\n", .{result1});
    
    // 使用 catch
    const result2 = divide(10, 0) catch |err| {
        std.debug.print("错误: {}\n", .{err});
        return;
    };
    
    // 使用 if-else
    if (divide(10, 3)) |result| {
        std.debug.print("结果: {d}\n", .{result});
    } else |err| {
        std.debug.print("错误: {}\n", .{err});
    }
}

4.5 递归函数

pub fn factorial(n: u64) u64 {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

pub fn fibonacci(n: u64) u64 {
    if (n <= 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

pub fn main() void {
    const fac5 = factorial(5);
    const fib6 = fibonacci(6);
    
    std.debug.print("5的阶乘: {d}\n", .{fac5});
    std.debug.print("第6个斐波那契数: {d}\n", .{fib6});
}

练习:

  1. 实现一个函数,接受一个整数数组,返回其最大值和最小值
  2. 编写一个递归函数计算数组元素的和
  3. 实现一个安全的除法函数,处理除零和溢出错误
  4. 创建一个函数,接受可变数量的参数并返回它们的平均值

注意事项:

  1. 函数参数默认是不可变的
  2. 错误处理是显式的,必须处理所有可能的错误
  3. 递归函数要注意终止条件
  4. 使用文档注释来说明函数的用途和参数

下一步:

在下一章中,我们将学习复合数据类型,包括数组、切片、结构体和枚举等。

标签:std,const,函数,i32,pub,zig,return,fn
From: https://blog.csdn.net/hzether/article/details/145164078

相关文章

  • C++ lambda函数
    lambda函数是C++11标准新增的语法糖,也称为lambda表达式或匿名函数。lambda函数的特点是:距离近、简洁、高效和功能强大。 语法:​[](constint&no)->void{cout<<"亲爱的"<<no<<"号:我是一个一个aaaa。\n";};代码示例:#include<iostream>#include<vector>#......
  • SQL-按自定义格式进行编号的SQL自定义函数.090119
    生成格式如:DT.EMP.0000000001的自增emp_id,加入EmpBaseINfo表中。--生成格式如DT.EMP.0000000001  【Vegas Add】ALTERFUNCTION[dbo].[Get_EmpBaseInfo_AccountID](@RowIDasint)RETURNSnvarchar(50) as begin    declare@oidnvarchar(50)    dec......
  • 我的第一个云函数
    我的第一个云函数我们以定义一个将两个数字相加的函数作为我们第一个云函数的示例。在项目根目录找到project.config.json文件,新增cloudfunctionRoot字段,指定本地已存在的目录作为云开发的本地根目录示例:{"cloudfunctionRoot":"cloudfunctions/"}project.config.j......
  • 云函数
    云函数云函数即在云端(服务器端)运行的函数。在物理设计上,一个云函数可由多个文件组成,占用一定量的CPU内存等计算资源;各云函数完全独立;可分别部署在不同的地区。开发者无需购买、搭建服务器,只需编写函数代码并部署到云端即可在小程序端调用,同时云函数之间也可互相调用。一个云函......
  • 【机器学习:十七、多分类问题和Softmax函数】
    1.多分类问题1.1多分类问题定义多分类问题是指一个模型需要从多个类别中选择一个类别作为输出的任务。与二分类问题不同,多分类任务中类别的数量n>2......
  • 深入探索:函数栈帧的神秘世界及其背后原理
    文章目录什么是函数栈帧理解函数栈帧的作用函数栈帧的创建和销毁解析什么是栈?相关寄存器和汇编指令函数栈帧的创建和销毁过程准备环境函数栈帧的创建函数栈帧的销毁前言:在C语言中,函数是程序的基本单位,我们通过函数来实现特定的功能。然而,函数如何被调用、返回值如......
  • 生成函数
    生成函数浅讲感觉这是一个非常牛逼的东西,写了点自己的感悟,可能讲得不是很清楚。生成函数的定义就比较牛,将数列\(\{a_i\}\)写成一个函数\(A(x)=\sum{a_ix^i}\)的形式叫做普通生成函数。此处的\(x^i\)没有实际意义,只是一个占位符。对于生成函数来说,绝大数多项式的运算法则......
  • 使用QFuture和QFutureWatcher实现不阻塞界面的Async函数
    简述很多时候,在Qt里面需要运行一个耗时函数的时候,为了避免阻塞界面,需要放入非主线程去执行。实现这样处理的方法有好几种,例如:写一个继承自QThread类,实现run接口;写一个继承自QObject的类,添加槽函数执行任务,创建对象,移入一个QThread中进行调用;写一个QRunnable的子类,创建对象,添......
  • C++ 面向对象(构造 & 析构函数)
    二、构造&析构函数2.1构造和析构2.1.1功能构造函数功能构造函数在类实例化对象时用于完成对象成员的初始化,通常包括以下操作:   1.为成员变量分配内存空间   2.初始化成员变量   3.执行类似打开文件、分配资源等额外操作析构函数功能主要作用......
  • 插值函数和插值多项式
    目录插值函数插值多项式插值函数设函数y=f(x)f(x)f(x)在区间......