Saltar al contenido principal

Operadores

Los operadores son símbolos que realizan operaciones sobre valores. Aquí se muestra cómo los diferentes lenguajes manejan los operadores aritméticos, de comparación, lógicos y a nivel de bits.

Operadores Aritméticos y de Asignación​

// Arithmetic
5 + 3; // 8 (addition)
5 - 3; // 2 (subtraction)
5 * 3; // 15 (multiplication)
5 / 3; // 1.6667 (division)
5 % 3; // 2 (modulo)
5 ** 3; // 125 (exponentiation)

// Increment / Decrement
let x = 5;
x++; // 6 (post-increment)
++x; // 7 (pre-increment)
x--; // 6 (post-decrement)

// Assignment
x += 3; // x = x + 3
x -= 2; // x = x - 2
x *= 4; // x = x * 4
x /= 2; // x = x / 2
x %= 3; // x = x % 3
x **= 2; // x = x ** 2

Operadores de Comparación y Lógicos​

// Comparison
5 == "5"; // true (loose equality)
5 === "5"; // false (strict equality)
5 != "5"; // false (loose inequality)
5 !== "5"; // true (strict inequality)
5 > 3; // true
5 >= 5; // true
5 < 10; // true
5 <= 5; // true

// Logical
true && false; // false (AND)
true || false; // true (OR)
!true; // false (NOT)

// Nullish coalescing
null ?? "default"; // "default"
undefined ?? "default"; // "default"
0 ?? "default"; // 0

// Optional chaining
user?.address?.city;
arr?.[0];
func?.();

Puntos Clave​

  • La sobrecarga de operadores depende del lenguaje -- C++ y Swift permiten operadores personalizados para tipos definidos por el usuario; Rust usa traits como Add y Sub para la sobrecarga. Python permite __add__, __sub__ y métodos similares para definir el comportamiento de los operadores. Go y Java prohíben la sobrecarga de operadores para tipos de usuario, por lo que se usan métodos en su lugar (por ejemplo, a.Add(b) en Go). Si necesitas operadores numéricos expresivos o específicos de dominio (por ejemplo, matemáticas vectoriales), prefiere C++, Rust, Swift o Python; si quieres semánticas más simples y predecibles, Go o Java pueden ser mejores.

  • Null coalescing (??) y optional chaining (?.) -- JavaScript, C#, Swift, PHP 8+ y Ruby soportan ?? para valores por defecto cuando un valor es null/undefined y ?. para acceso seguro a propiedades. Por ejemplo, user?.address?.city ?? "unknown" evita errores de puntero nulo. Go y Rust no tienen null; Go usa verificaciones explícitas de nil; Rust usa Option con unwrap_or(0) u orelse 0 en Zig. C y Java carecen de equivalentes nativos y dependen de verificaciones manuales o bibliotecas. Al trabajar con datos anulables, prefiere lenguajes con manejo de null de primera clase para reducir código repetitivo y bugs.

  • El comportamiento del overflow difiere -- Zig entra en pánico por overflow en builds de debug y hace wrapping en release; Rust ofrece checked_add, wrapping_add y saturating_add para que elijas el comportamiento. C y C++ tienen comportamiento indefinido en overflow de enteros, lo que puede llevar a problemas de seguridad. JavaScript y Python usan enteros de precisión arbitraria, por lo que el overflow está efectivamente ausente. Para código numérico seguro, usa las APIs checked de Rust o los operadores explícitos de Zig; evita depender de la semántica de overflow de C/C++.

  • Semántica de la división entera -- El / de Python 3 siempre retorna un float (5 / 3 es 1.666...); // es la división entera. C, Go, Rust y Java usan división truncada para enteros (5 / 3 es 1). Esto afecta la portabilidad al mover código numérico entre lenguajes. Para consistencia, usa división entera explícita (// en Python, @divTrunc en Zig) o convierte a float cuando necesites resultados fraccionarios. Al portar algoritmos, verifica la semántica de la división para evitar errores de redondeo o off-by-one.

  • Los operadores de incremento/decremento están ausentes en algunos lenguajes -- Rust, Python, Swift y Zig omiten ++ y --; Go los tiene pero solo como sentencias (por ejemplo, x++), no como expresiones. Estos lenguajes prefieren el explícito x += 1 para mayor claridad y para evitar la confusión de pre/post-incremento (por ejemplo, i++ vs ++i). C, C++, C#, Java, JavaScript y PHP mantienen ++/--. Si cambias entre lenguajes, usa x += 1 por defecto donde esté disponible para evitar problemas de portabilidad y bugs sutiles.