← C EspañolChapter 03 of 13

Operadores

## Objetivos de Aprendizaje - Dominar los operadores aritméticos - Comprender los operadores de comparación - Aprender los operadores lógicos - Trabajar con operadores bit a bit ## Operadores Aritméticos ### Operaciones Básicas ```c int a = 10, b = 3; printf("%d\n", a + b); // 13 (suma) printf("%d\n", a - b); // 7 (resta) printf("%d\n", a * b); // 30 (multiplicación) printf("%d\n", a / b); // 3 (división entera) printf("%d\n", a % b); // 1 (módulo/resto) ``` ### Comportamiento de la División ```c // La división entera trunca printf("%d\n", 10 / 3); // 3, no 3.333 // Para punto flotante printf("%f\n", 10.0 / 3.0); // 3.333... ``` ### Incremento/Decremento ```c int x = 5; // Pre-incremento/decremento printf("%d\n", ++x); // 6 (incrementa primero) printf("%d\n", --x); // 5 (decrementa primero) // Post-incremento/decremento printf("%d\n", x++); // 5 (usa valor, luego incrementa) printf("%d\n", x); // 6 (ahora incrementado) int y = 5; printf("%d\n", y--); // 5 (usa valor, luego decrementa) printf("%d\n", y); // 4 ``` ## Operadores de Comparación ### Operadores Relacionales ```c int a = 5, b = 10; printf("%d\n", a == b); // 0 (falso) printf("%d\n", a != b); // 1 (verdadero) printf("%d\n", a < b); // 1 (verdadero) printf("%d\n", a > b); // 0 (falso) printf("%d\n", a <= b); // 1 (verdadero) printf("%d\n", a >= b); // 0 (falso) ``` ### No Confundir ```c // = es asignación // == es comparación int x = 5; // if (x = 10) // ¡WRONG! Esto asigna 10 a x if (x == 5) // ¡CORRECTO! Esto compara ``` ## Operadores Lógicos ### AND, OR, NOT ```c int a = 1, b = 0; // 1 = verdadero, 0 = falso printf("%d\n", a && b); // 0 (AND - ambos deben ser verdaderos) printf("%d\n", a || b); // 1 (OR - uno debe ser verdadero) printf("%d\n", !a); // 0 (NOT - invierte) ``` ### Evaluación de Cortocircuito ```c // && se detiene si el primero es falso if (x != 0 && y / x > 2) { // Seguro - no dividirá por cero } // || se detiene si el primero es verdadero if (ptr == NULL || ptr->value > 0) { // Seguro - no desreferenciará NULL } ``` ### Tabla de Verdad | A | B | A && B | A \|\| B | !A | |---|---|--------|----------|-----| | 1 | 1 | 1 | 1 | 0 | | 1 | 0 | 0 | 1 | 0 | | 0 | 1 | 0 | 1 | 1 | | 0 | 0 | 0 | 0 | 1 | ## Operadores de Asignación ### Asignación Simple ```c int x = 10; ``` ### Asignación Compuesta ```c int x = 10; x += 5; // x = 15 (x = x + 5) x -= 3; // x = 12 (x = x - 3) x *= 2; // x = 24 (x = x * 2) x /= 4; // x = 6 (x = x / 4) x %= 5; // x = 1 (x = x % 5) ``` ### Asignación Compuesta Bit a Bit ```c int flags = 0b1010; // 10 en decimal flags &= 0b0111; // flags = flags & 0b0111 flags |= 0b0001; // flags = flags | 0b0001 flags ^= 0b0100; // flags = flags ^ 0b0100 ``` ## Operadores Bit a Bit ### Operaciones Binarias ```c int a = 5, b = 3; // 101 y 011 en binario printf("%d\n", a & b); // 1 (AND: 101 & 011 = 001) printf("%d\n", a | b); // 7 (OR: 101 | 011 = 111) printf("%d\n", a ^ b); // 6 (XOR: 101 ^ 011 = 110) printf("%d\n", ~a); // -6 (NOT: ~00000101 = 11111010) printf("%d\n", a << 1); // 10 (desplazamiento izquierda: 101 << = 1010) printf("%d\n", a >> 1); // 2 (desplazamiento derecha: 101 >> = 10) ``` ### Usos Comunes ```c // Verificar si un bit está establecido int flags = 0b1010; if (flags & 0b1000) { printf("Bit 3 está establecido\n"); } // Establecer un bit flags = flags | 0b0001; // Cambiar un bit flags = flags ^ 0b0100; // Extraer los 4 bits inferiores int lower = flags & 0xF; ``` ### Desplazamiento Derecho con Signo **Advertencia:** El desplazamiento derecho en números negativos con signo depende de la implementación. ```c // Para números positivos: desplazamiento aritmético (llena con 0) // Para números negativos: a menudo desplazamiento aritmético (llena con 1) int neg = -4; printf("%d\n", neg >> 1); // Puede ser -2 o -1 dependiendo de la implementación ``` ## Operador Coma ```c // Evalúa izquierda, luego derecha, retorna el valor derecho int x = (a = 5, b = 10, a + b); // x = 15 // Común en bucles for for (int i = 0, j = 10; i < 5; i++, j--) { printf("%d %d\n", i, j); } ``` ## Operador Ternario ### Sintaxis ```c // condición ? valorSiVerdadero : valorSiFalso int max = (a > b) ? a : b; int status = (age >= 18) ? 1 : 0; ``` ### Ternario Anidado ```c int grade = (score >= 90) ? 'A' : (score >= 80) ? 'B' : (score >= 70) ? 'C' : (score >= 60) ? 'D' : 'F'; ``` ## Operador sizeof ```c int x; printf("%zu\n", sizeof(int)); // Tamaño del tipo printf("%zu\n", sizeof(x)); // Tamaño de la variable printf("%zu\n", sizeof 10); // Tamaño de la constante int arr[10]; printf("%zu\n", sizeof(arr)); // 40 (10 * 4 bytes) ``` ## Precedencia de Operadores ### De Mayor a Menor | Prioridad | Operadores | |-----------|-------------------| | 1 | `()` | | 2 | `++`, `--`, `!`, `~` | | 3 | `*`, `/`, `%` | | 4 | `+`, `-` | | 5 | `<<`, `>>` | | 6 | `<`, `>`, `<=`, `>=` | | 7 | `==`, `!=` | | 8 | `&` | | 9 | `^` | | 10 | `\|` | | 11 | `&&` | | 12 | `\|\|` | | 13 | `?:` | | 14 | `=`, `+=`, `-=`, etc. | | 15 | `,` | ### Usar Paréntesis ```c // Precedencia clara if ((a > b) && (c < d)) { } // En lugar de confiar en la memoria if (a > b && c < d) { // Igual, pero menos claro } ``` ## Resumen - Aritméticos: `+`, `-`, `*`, `/`, `%` - Incremento/Decremento: `++x`, `x++`, `--x`, `x--` - Comparación: `==`, `!=`, `<`, `>`, `<=`, `>=` - Lógicos: `&&`, `||`, `!` - Asignación: `=`, `+=`, `-=`, etc. - Bit a bit: `&`, `|`, `^`, `~`, `<<`, `>>` - Ternario: `condición ? verdadero : falso` - sizeof: retorna tamaño en bytes - Usar paréntesis para aclarar precedencia

Comments

Comments powered by Giscus

To enable comments, add your Giscus embed code here.

Learn more about Giscus →