@max em Zig — Referência e Exemplos

@max em Zig

O @max retorna o maior de dois valores. Funciona com inteiros, floats e valores comptime. Se os dois valores forem conhecidos em comptime, o resultado também é comptime. Complementar ao @min, é usado para garantir valores mínimos, limitar intervalos e encontrar extremos.

Sintaxe

@max(a: T, b: T) T

Parâmetros

  • a (T): Primeiro valor.
  • b (T): Segundo valor (mesmo tipo ou coercível).

Valor de retorno

Retorna T — o maior dos dois valores.

Exemplos práticos

Exemplo 1: Uso básico

const std = @import("std");

pub fn main() void {
    std.debug.print("max(10, 20) = {}\n", .{@max(@as(u32, 10), @as(u32, 20))}); // 20
    std.debug.print("max(-5, 3) = {}\n", .{@max(@as(i32, -5), @as(i32, 3))});   // 3
    std.debug.print("max(1.5, 2.7) = {d}\n", .{@max(@as(f64, 1.5), @as(f64, 2.7))}); // 2.7
}

Exemplo 2: Garantir valor mínimo

const std = @import("std");

const Config = struct {
    threads: u32,
    buffer_size: usize,
};

fn normalizar(config: Config) Config {
    return .{
        // Pelo menos 1 thread
        .threads = @max(config.threads, 1),
        // Buffer de pelo menos 4096 bytes
        .buffer_size = @max(config.buffer_size, 4096),
    };
}

pub fn main() void {
    const config = normalizar(.{ .threads = 0, .buffer_size = 100 });
    std.debug.print("Threads: {}, Buffer: {}\n", .{ config.threads, config.buffer_size });
    // Threads: 1, Buffer: 4096
}

Exemplo 3: Encontrar máximo em slice

const std = @import("std");

fn maximo(valores: []const i32) ?i32 {
    if (valores.len == 0) return null;

    var max_val = valores[0];
    for (valores[1..]) |v| {
        max_val = @max(max_val, v);
    }
    return max_val;
}

pub fn main() void {
    const dados = [_]i32{ 5, -3, 12, 8, -1, 20, 7 };
    if (maximo(&dados)) |m| {
        std.debug.print("Máximo: {}\n", .{m}); // 20
    }
}

Casos de uso comuns

  1. Valor mínimo garantido: Garantir que configurações não fiquem abaixo de um limite.
  2. Clamping: Combinar com @min para restringir valores a um intervalo.
  3. Redução: Encontrar o maior valor em uma coleção.
  4. Layout: Calcular tamanho máximo necessário para buffers ou contêineres.

Builtins relacionados

  • @min — Retorna o menor de dois valores
  • @addWithOverflow — Aritmética com detecção de overflow
  • @as — Conversão de tipo

Tutoriais relacionados

Continue aprendendo Zig

Explore mais tutoriais e artigos em português para dominar a linguagem Zig.