<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ programacion c - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ programacion c - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 30 May 2026 19:37:02 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/tag/programacion-c/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ El Manual para principiantes C: Aprende las bases del lenguaje de programación C en sólo unas horas ]]>
                </title>
                <description>
                    <![CDATA[ Este manual sigue la regla 80/20. Aprenderás 80% del lenguaje de programación C en 20% del tiempo. Este enfoque te dará una visión amplia del lenguaje. Este manual no trata de cubrir todo lo relacionado con C, sino que se enfoca en el núcleo del lenguaje, tratando de simplificar los ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/el-libro-para-principiantes-c-aprende-las-bases-del-lenguaje-de-programacion-c-en-solo-unas-horas/</link>
                <guid isPermaLink="false">62df90c6b4def50851974a89</guid>
                
                    <category>
                        <![CDATA[ programacion c ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Israel Palma ]]>
                </dc:creator>
                <pubDate>Tue, 11 Jun 2024 19:09:09 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/04/coverc-1-opt.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/the-c-beginners-handbook/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The C Beginner's Handbook: Learn C Programming Language basics in just a few hours</a>
      </p><p>Este manual sigue la regla 80/20. Aprenderás 80% del lenguaje de programación C en 20% del tiempo.</p><p>Este enfoque te dará una visión amplia del lenguaje.</p><p>Este manual no trata de cubrir todo lo relacionado con C, sino que se enfoca en el núcleo del lenguaje, tratando de simplificar los temas más complejos.</p><p><a href="https://thevalleyofcode.com/download/c/">Puedes tener la versión PDF y ePub de este manual en inglés acá (hecha por el autor original)</a></p><p>¡Disfruta!</p><h2 id="tabla-de-contenidos">Tabla de Contenidos</h2><ol><li><a href="#intro">Introducción a C</a></li><li><a href="#variables">Variables y tipos</a></li><li><a href="#constantes">Constantes</a></li><li><a href="#operadores">Operadores</a></li><li><a href="#condicionales">Condicionales</a></li><li><a href="#bucles">Bucles,</a></li><li><a href="#arreglos">Arréglos</a></li><li><a href="#strings">Strings</a> (Cadenas de texto)</li><li><a href="#punteros">Punteros</a></li><li><a href="#funciones">Funciones</a></li><li><a href="#entradas-y-salidas">Entrada y Salida</a></li><li><a href="#scope">Alcance de las variables</a></li><li><a href="#variables-estaticas">Variables estáticas</a></li><li><a href="#variables-globales">Variables Globales</a></li><li><a href="#definiciones-de-tipos">Definiciones de tipos</a></li><li><a href="#tipos-enumerados">Tipos enumerados</a></li><li><a href="#estructuras">Estructuras</a></li><li><a href="#parametros-de-linea-de-comandos">Parámetros de línea de comando</a>s</li><li><a href="#archivos-de-cabecera">Archivos de Cabecera</a></li><li><a href="#preprocesador">Preprocesador</a></li><li><a href="#conclusion">Conclusión</a></li></ol><!--kg-card-begin: html--><h2 id="intro">Introducción a C</h2>
<!--kg-card-end: html--><p>C es probablemente el lenguaje de programación más conocido. Es usado como un lenguaje de referencia para cursos de programación alrededor de todo el mundo, y es probablemente el lenguaje más aprendido por las personas junto con Python y Java.</p><p>Recuerdo que fue mi segundo lenguaje de programación después de Pascal.</p><p>C no es sólo algo que usan los estudiantes para aprender programación. No es un lenguaje académico. Y diría que no es el lenguaje más fácil, porque C es un lenguaje de programación de bajo nivel.</p><p>Al día de hoy, C es ampliamente usado en dispositivos integrados, y alimenta la mayoría de los servidores de internet, los cuales están construidos usando Linux. El Kernel de Linux está construido usando C, esto significa también que alimenta el núcleo de todos los dispositivos Android. Podríamos decir que justo en este momento, el código C se ejecuta en un gran número de aplicaciones en el mundo entero. Lo cual es bastante notable.</p><p>Cuando fue creado, C se consideraba un lenguaje de alto nivel, porque era portable entre máquinas. Ahora damos por sentado que podemos ejecutar un programa escrito en una Mac, Windows o Linux, usando tal vez Node.js o Python.</p><p>Hace algún tiempo, esto simplemente no era el caso. Lo que C trajo a la mesa era un lenguaje simple de implementar y que tenía un compilador que podía ser fácilmente portado a diferentes máquinas.</p><p>Dije un compilador: C es un lenguaje compilado, como Go, Java, Swift o Rust. Otros lenguajes de programación populares como Python, Ruby o JavaScript son interpretados. La diferencia consiste en: un lenguaje compilado genera un archivo binario que puede ser directamente ejecutado y distribuido.</p><p>C no tiene recolección de basura. Esto significa que tenemos que manejar la memoria por nuestra cuenta. Es una tarea compleja, y una que requiere mucha de nuestra atención para prevenir bugs, pero esto hace también que C sea ideal para escribir programas para dispositivos integrados como Arduino.</p><p>C no esconde la complejidad y capacidades de la máquina debajo. Tienes mucho poder, una vez que sabes qué puedes hacer.</p><p>Quiero presentarte el primer programa C, el cual llamaremos ¡"Hola Mundo!"</p><p>hola. c</p><!--kg-card-begin: markdown--><pre><code>#include &lt;stdio.h&gt;

int main(void) {
    printf("Hola Mundo!");
}
</code></pre>
<!--kg-card-end: markdown--><p>Describamos el código del programa: primero importamos la librería <code>stdio</code> (el nombre significa librería estándar de entradas y salidas).</p><p>Esta librería nos da acceso a las funciones I/O, es decir de entrada y salida (input/output).</p><p>C es un lenguaje muy pequeño en su núcleo, y cualquier cosa que no sea parte del núcleo se provee a través de librerías. Algunas de estas librerías están construidas por programadores normales que las habilitan para que otros los usen. Algunas librerías están integradas en el compilador. Como <code>stdio</code> y otras.</p><p><code>stdio</code> es la librería que provee la función <code>printf()</code>.</p><p>Esta función está envuelta en la función <code>main()</code>, que es el punto de entrada de cualquier programa en C.</p><p>Pero entonces, ¿Qué es una función?</p><p>Una función es una rutina que toma uno o más argumentos, y devuelve un valor.</p><p>En el caso de la función <code>main()</code> no recibe argumentos, y retorna un entero. Identificamos esto usando la palabra clave <code>void</code> para el argumento, y la palabra clave <code>int</code> para el valor de retorno.</p><p>La función tiene un cuerpo, el cual está entre los paréntesis de llave. Dentro del cuerpo tenemos todo el código que la función necesita para realizar sus operaciones.</p><p>La función <code>printf()</code> está escrita de forma diferente, como podrás ver. Esta no tiene un valor de retorno definido, y le pasamos una cadena de texto entre comillas dobles. Nosotros no especificamos el tipo de argumento.</p><p>Esto es porque esta es una invocación de función. En algún lugar, dentro de la librería <code>stdio</code>, la función <code>printf</code> está definida como: </p><!--kg-card-begin: markdown--><pre><code>int printf(const char *format, ... );
</code></pre>
<!--kg-card-end: markdown--><p>No necesitas entender qué significa esto por ahora, pero, en resumen, esta es la definición. Y cuando llamamos a <code>printf("Hola Mundo!");</code> ahí es donde se ejecuta la función.</p><p>La función <code>main()</code> que definimos arriba: </p><!--kg-card-begin: markdown--><pre><code>#include &lt;stdio.h&gt;

int main(void) {
    printf("¡Hola Mundo!");
}</code></pre>
<!--kg-card-end: markdown--><p>será ejecutada por el sistema operativo cuando a su vez, el programa sea ejecutado.</p><p>¿Cómo ejecutamos un programa C?</p><p>Como mencioné, C es un lenguaje compilado. Para ejecutar el programa debemos compilarlo primero. Cualquier computador con Linux o MacOS ya viene con un compilador C integrado. Para Windows, puedes usar el subsistema de Windows para Linux (WSL).</p><p>Cuando abras la terminal puedes escribir <code>gcc</code>, y este comando debería retornar un error diciendo que no especificaste un archivo:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-1.png" class="kg-image" alt="imagen-1" width="465" height="188" loading="lazy"><figcaption>Linux Ubuntu Terminal</figcaption></figure><p>Esto está bien. Significa que el compilador está ahí, y podemos comenzar a usarlo.</p><p>Ahora escribiremos el programa de arriba en el archivo <code>hola.c</code>. Puedes usar cualquier editor, para mantener la simplicidad usaré el editor <code>nano</code> en la línea de comandos:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-2.png" class="kg-image" alt="imagen-2" width="465" height="188" loading="lazy"></figure><p>Escribe el programa:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-3.png" class="kg-image" alt="imagen-3" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/12/imagen-3.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-3.png 720w" sizes="(min-width: 720px) 720px" width="720" height="394" loading="lazy"></figure><p>Ahora presiona <code>ctrl-x</code> para salir:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-4.png" class="kg-image" alt="imagen-4" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/12/imagen-4.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-4.png 720w" sizes="(min-width: 720px) 720px" width="720" height="394" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Confirma presionando la tecla <code>S</code>, y luego presiona enter para confirmar el nombre del archivo:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-5.png" class="kg-image" alt="imagen-5" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/12/imagen-5.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-5.png 720w" sizes="(min-width: 720px) 720px" width="720" height="394" loading="lazy"></figure><p>Esto de debería traer de vuelta a la terminal:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-6.png" class="kg-image" alt="imagen-6" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/12/imagen-6.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-6.png 720w" sizes="(min-width: 720px) 720px" width="720" height="394" loading="lazy"></figure><p>Ahora escribe</p><!--kg-card-begin: markdown--><pre><code>gcc hola.c -o hola
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-7.png" class="kg-image" alt="imagen-7" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/12/imagen-7.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-7.png 720w" sizes="(min-width: 720px) 720px" width="720" height="394" loading="lazy"></figure><p>Esto debería haber generado un ejecutable <code>hola</code>. Ahora escribe <code>./hola</code> para ejecutarlo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-8.png" class="kg-image" alt="imagen-8" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/12/imagen-8.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-8.png 720w" sizes="(min-width: 720px) 720px" width="720" height="394" loading="lazy"></figure><p>Antepongo <code>./</code> al nombre del programa para decirle al terminal que el comando es para el directorio actual.</p><p>¡Impresionante!</p><p>Ahora si invocas <code>ls -al hola</code>, verás que el programa es de tan solo 16KB:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-9.png" class="kg-image" alt="imagen-9" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/12/imagen-9.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-9.png 720w" sizes="(min-width: 720px) 720px" width="720" height="394" loading="lazy"></figure><p>Este es uno de los pros de C: está altamente optimizado, esta también, es una de las razones por las que es bueno para sistemas integrados que tienen una cantidad limitada de recursos.</p><!--kg-card-begin: html--><h2 id="variables">Variables y tipos</h2><!--kg-card-end: html--><p>C es un lenguaje de tipo estático.</p><p>Esto significa que cualquier variable tiene un tipo asociado, y si tipo es conocido al momento de la compilación.</p><p>Esto es muy distinto a como trabajamos con variables en Python, JavaScript, PHP y otros lenguajes interpretados.</p><p>Cuando creas una variable en C, tienes que especificar el tipo de variable en la declaración.</p><p>En este ejemplo iniciamos una variable <code>edad</code> con el tipo <code>int</code>:</p><!--kg-card-begin: markdown--><pre><code>int edad;
</code></pre>
<!--kg-card-end: markdown--><p>Un nombre de variable puede tener mayúsculas, minúsculas, puede contener dígitos y el guion bajo, pero no puede empezar con un dígito. <code>EDAD</code> y <code>Edad10</code> son nombres de variables válidos, <code>1edad</code> no lo es.</p><p>También puedes iniciar la declaración de una variable especificando su valor inicial:</p><!--kg-card-begin: markdown--><pre><code>int edad = 37;
</code></pre>
<!--kg-card-end: markdown--><p>Una vez que declaras una variable podrás usarla en el código de tu programa. Puedes cambiar su valor en cualquier momento, usando el operador <code>=</code>, por ejemplo en <code>edad=100; </code> (siempre que el nuevo valor sea del mismo tipo).</p><p>En este caso:</p><!--kg-card-begin: markdown--><pre><code>#include &lt;stdio.h&gt;

int main(void) {
    int edad = 0;
    edad = 37.2;
    printf("%u", edad);
}</code></pre>
<!--kg-card-end: markdown--><p>El compilador lanzará una advertencia en tiempo de compilación, y convertirá el número decimal en un número entero.</p><p>Los tipos de datos integrados en C son <code>int</code>, <code>char</code>, <code>short</code>, <code>long</code>, <code>float</code>, <code>double</code> y <code>long double</code>. Aprendamos más sobre ellos.</p><h3 id="n-meros-enteros">Números enteros</h3><p>C nos provee los siguientes tipos para definir valores enteros:</p><ul><li><code>char</code></li><li><code>int</code></li><li><code>short</code></li><li><code>long</code></li></ul><p>La mayoría del tiempo es probable que uses <code>int</code> para almacenar enteros. Pero en algunos casos podrías querer usar una de las otras 3 opciones.</p><p>El tipo <code>char</code> es comúnmente usado para almacenar letras de la tabla ASCII, pero puede ser usado para guardar pequeños enteros desde <code>-128</code> a <code>127</code>. Esto usa al menos 1 byte.</p><p><code>int</code> usa al menos 2 bytes. <code>short</code> usa al menos 2 bytes. <code>long</code> usa al menos 4 bytes.</p><p>Como puedes ver, no se nos garantiza los mismos valores para diferentes entornos. Sólo tenemos una indicación. El problema es que el número exacto de bits que puede ser almacenado en cada tipo de dato depende de la implementación y arquitectura.</p><p>Tenemos garantizado que <code>short</code> no es más grande que <code>int</code>. Y tenemos garantizado que <code>long</code> no es más pequeño que <code>int</code>.</p><p>El estándar de especificaciones ANSI C determina los valores mínimos de cada tipo, y gracias a este, podemos al menos saber cuál es el valor mínimo que podemos esperar tener a nuestra disposición.</p><p>Si estás programando C en un Arduino, diferentes placas tendrán diferentes límites.</p><p>En una placa Arduino Uno, <code>int</code> almacena un valor de 2 byte, con rangos desde <code>-32,768</code> a <code>32,767</code>. En Arduino MKR 1010 <code>int</code> almacena un valor de 4 bytes, con rangos desde <code>-2,147,483,648</code> a <code>2,147,483,647</code>. Una gran diferencia.</p><p>En todas las placas Arduino, <code>short</code> almacena valores de 2 bytes, con rangos desde <code>-32,768</code> a <code>32,767</code>. <code>long</code> almacena 4 bytes, con rangos desde <code>-2,147,483,648</code> a <code>2,147,483,647</code>.</p><h3 id="enteros-sin-signo">Enteros sin signo</h3><p>Para todos los tipos de datos arriba, podemos anteponer <code>unsigned</code> para comenzar el rango desde <code>0</code>, en vez de números negativos. Esto podría tener sentido en muchas formas.</p><ul><li><code>unsigned char</code> tiene un rango de <code>0</code> hasta al menos <code>255</code></li><li><code>unsigned int</code> tiene un rango de <code>0</code> hasta al menos <code>65,535</code></li><li><code>unsigned short</code> tiene un rango de <code>0</code> hasta al menos <code>65,535</code></li><li><code>unsigned long</code> tiene un rango de <code>0</code> hasta al menos <code>4,294,967,295</code></li></ul><h3 id="problema-con-el-desbordamiento">Problema con el desbordamiento</h3><p>Dados todos estos límites puede surgir una duda: ¿Cómo podemos estar seguros de que nuestros números no excederán los límites? Y ¿Qué pasa si excedimos estos límites?</p><p>Si tienes un número de tipo <code>unsigned int</code> en 255, y lo incrementas, tendrás 256 de retorno, como podrías esperar. Si tienes un número de tipo <code>unsigned char</code> en 255, y lo incrementas, obtendrás un <code>0</code> de retorno. Este se resetea empezando desde el posible valor inicial.</p><p>Si tienes un número de tipo <code>unsigned char</code> en 255 y luego sumas 10 a él, obtendrás el número 9:</p><!--kg-card-begin: markdown--><pre><code>#include &lt;stdio.h&gt;

int main(void) {
    unsigned char j = 255;
    j = j + 10:
    printf("%u", j); /*9*/
}
</code></pre>
<!--kg-card-end: markdown--><p>Si no tienes un valor con signo, el comportamiento es indefinido. Esto básicamente te dará un número gigante que puede variar, como en este caso:</p><!--kg-card-begin: markdown--><pre><code>#include &lt;stdio.h&gt;

int main(void) {
    char j = 127;
    j = j + 10;
    printf("%u", j); /* 4294967177 */
}
</code></pre>
<!--kg-card-end: markdown--><p>En otras palabras, C no te protege de salirte de los límites de un tipo. Tienes que hacerte cargo por ti mismo.</p><h3 id="advertencias-cuando-declaras-el-tipo-equivocado">Advertencias cuando declaras el tipo equivocado</h3><p>Cuando declaras una variable y la inicializas con el valor equivocado, el compilador <code>gcc</code> (el que probablemente estés usando) debería advertirte:</p><!--kg-card-begin: markdown--><pre><code>#include &lt;stdio.h&gt;

int main(void) {
    char j = 1000;
}
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-10.png" class="kg-image" alt="imagen-10" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/12/imagen-10.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/12/imagen-10.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-10.png 1260w" sizes="(min-width: 720px) 720px" width="1260" height="184" loading="lazy"></figure><p>Y también te advierte en asignaciones directas:</p><!--kg-card-begin: markdown--><pre><code>#include &lt;stdio.h&gt;

int main(void) {
    char j;
    j = 1000;
}
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-11.png" class="kg-image" alt="imagen-11" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/12/imagen-11.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/12/imagen-11.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2022/12/imagen-11.png 1260w" sizes="(min-width: 720px) 720px" width="1260" height="184" loading="lazy"></figure><p>Pero no te advertirá si aumentas el número usando <code>+=</code>, por ejemplo: </p><!--kg-card-begin: markdown--><pre><code>#include &lt;stdio.h&gt;

int main(void) {
    char j = 0;
    j += 1000;
}
</code></pre>
<!--kg-card-end: markdown--><h3 id="n-meros-de-punto-flotante">Números de punto flotante</h3><p>Los tipos de punto flotante (<code>float</code>) pueden representar un conjunto de valores mucho más grandes de lo que pueden hacer los enteros (<code>int</code>), también pueden representar fracciones, algo que los enteros no pueden hacer.</p><p>Al usar números de punto flotante, representamos lo números como números decimales multiplicados por potencias de 10.</p><p>Tal vez veas números de punto flotante escritos como:</p><ul><li><code>1.29e-3</code></li><li><code>-2.3e+5</code></li></ul><p>y de otras formas aparentemente extrañas.</p><p>Los siguientes tipos:</p><ul><li><code>float</code></li><li><code>double</code></li><li><code>long double</code></li></ul><p>son usados para representar números con punto decimal (tipos de punto flotante). Todos ellos pueden representar números positivos y negativos.</p><p>Los requerimientos mínimos para cualquier implementación en C es que <code>float</code> puede representar un rango entre <code>10^-37</code> y <code>10^+37</code>, y típicamente es implementado usando 32 bits. <code>double</code> puede representar conjuntos más grandes de números. <code>long double</code> puede tener incluso más números.</p><p>Las cifras exactas, al igual que con los números enteros, dependen de la implementación.</p><p>En una Mac moderna, un <code>float</code> es representado en 32 bits, y tiene una precisión de 24 bits significativos, de los cuales 8 bits son usados para codificar el exponente.</p><p>Un número <code>double</code> se representa en 64 bits, con una precisión de 53 bits significativos, 11 bits de los cuales son usados para codificar el exponente.</p><p>El tipo <code>long double</code> es representado en <code>80</code> bits, tiene una precisión de 64 bits significativos. 15 bits son usados para codificar el exponente.</p><p>En tu equipo, ¿cómo puedes determinar el tamaño específico de los tipos? Puedes escribir un programa para hacer eso:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
  printf("char size: %lu bytes\n", sizeof(char));
  printf("int size: %lu bytes\n", sizeof(int));
  printf("short size: %lu bytes\n", sizeof(short));
  printf("long size: %lu bytes\n", sizeof(long));
  printf("float size: %lu bytes\n", sizeof(float));
  printf("double size: %lu bytes\n", 
    sizeof(double));
  printf("long double size: %lu bytes\n", 
    sizeof(long double));
}
</code></pre><p>En mi sistema, Windows moderno, imprime:</p><pre><code>char size: 1 bytes
int size: 4 bytes
short size: 2 bytes
long size: 8 bytes
float size: 4 bytes
double size: 8 bytes
long double size: 16 bytes
</code></pre><!--kg-card-begin: html--><h2 id="constantes">Constantes</h2>
<!--kg-card-end: html--><p>Hablemos ahora de las constantes:</p><p>Una constante se declara de forma similar a las variables, excepto que anteponemos la palabra reservada <code>const</code> y siempre tienes que especificar un valor.</p><p>De la siguiente forma: </p><pre><code>const int age = 37;</code></pre><p>Esto es C perfectamente válido, aunque es común declarar las constantes con mayúsculas, así:</p><pre><code>const int AGE = 37;</code></pre><p>Esta es sólo una convención, pero una que puede ayudarte mucho mientras escribes o lees un programa C, ya que mejora su legibilidad. Los nombres en mayúscula significan constantes, nombres en minúsculas significas variables.</p><p>Un nombre de constante sigue las mismas reglas que los nombres de variables: pueden contener letras mayúsculas o minúsculas, pueden contener dígitos y el guión bajo (<code>_</code>), pero no pueden comenzar con un dígito. <code>EDAD</code> y <code>Edad10</code> son nombres de variables válidos, <code>1EDAD</code> no lo es.</p><p>Otra forma de definir constantes y mediante el uso de la siguiente sintaxis: </p><pre><code class="language-c">#define EDAD 37</code></pre><p>En este caso, tu no necesitas agregar el tipo, y tampoco necesitas agregar el signo igual <code>=</code>, y omites el punto y coma al final.</p><p>El compilador C inferirá el tipo del valor especificado en tiempo de compilación.</p><!--kg-card-begin: html--><h2 id="operadores">Operadores</h2><!--kg-card-end: html--><p>C ofrece una amplia variedad de operadores que podemos usar para operar en los datos.</p><p>En particular, podemos definir varios grupos de operadores:</p><ul><li>operadores aritméticos</li><li>operadores de comparación</li><li>operadores lógicos</li><li>operadores de asignación compuestos.</li><li>operadores bitwise</li><li>operadores de punteros</li><li>operadores de estructura</li><li>operadores misceláneos</li></ul><p>En esta sección voy a detallar todos ellos, usando dos variables imaginarias <code>a</code> y <code>b</code> como ejemplos.</p><p>Mantendré los operadores bitwise, operadores de estructura y punteros fuera de esta lista por simplicidad</p><h2 id="operadores-aritm-ticos">Operadores aritméticos</h2><p>En este macro-grupo separaré operadores binarios y unarios.</p><p>Los operadores binarios utilizan dos operandos:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Operator</th>
<th>Name</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>=</code></td>
<td>Assignment</td>
<td><code>a = b</code></td>
</tr>
<tr>
<td><code>+</code></td>
<td>Addition</td>
<td><code>a + b</code></td>
</tr>
<tr>
<td><code>-</code></td>
<td>Subtraction</td>
<td><code>a - b</code></td>
</tr>
<tr>
<td><code>*</code></td>
<td>Multiplication</td>
<td><code>a * b</code></td>
</tr>
<tr>
<td><code>/</code></td>
<td>Division</td>
<td><code>a / b</code></td>
</tr>
<tr>
<td><code>%</code></td>
<td>Modulo</td>
<td><code>a % b</code></td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>Los operadores unarios toman sólo un operando:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Operator</th>
<th>Name</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>+</code></td>
<td>Unary plus</td>
<td><code>+a</code></td>
</tr>
<tr>
<td><code>-</code></td>
<td>Unary minus</td>
<td><code>-a</code></td>
</tr>
<tr>
<td><code>++</code></td>
<td>Increment</td>
<td><code>a++</code> or <code>++a</code></td>
</tr>
<tr>
<td><code>--</code></td>
<td>Decrement</td>
<td><code>a--</code> or <code>--a</code></td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>La diferencia entre <code>a++</code> y <code>++a</code> es que <code>a++</code> incrementa la variable <code>a</code> después de usarla. <code>++a</code> incrementa la variable antes de usarla.</p><p>Por ejemplo:</p><figure class="kg-card kg-code-card"><pre><code>int a = 2; 
int b; 
b = a++ /* b es 2, a es 3*/ 
b = ++a /* b es 4, a es 4*/</code></pre><figcaption>Ejemplo</figcaption></figure><p>Lo mismo aplica para el operador decremento.</p><h3 id="operadores-de-comparaci-n">Operadores de comparación</h3><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Operator</th>
<th>Name</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>==</code></td>
<td>Equal operator</td>
<td><code>a == b</code></td>
</tr>
<tr>
<td><code>!=</code></td>
<td>Not equal operator</td>
<td><code>a != b</code></td>
</tr>
<tr>
<td><code>&gt;</code></td>
<td>Bigger than</td>
<td><code>a &gt; b</code></td>
</tr>
<tr>
<td><code>&lt;</code></td>
<td>Less than</td>
<td><code>a &lt; b</code></td>
</tr>
<tr>
<td><code>&gt;=</code></td>
<td>Bigger than or equal to</td>
<td><code>a &gt;= b</code></td>
</tr>
<tr>
<td><code>&lt;=</code></td>
<td>Less than or equal to</td>
<td><code>a &lt;= b</code></td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>‌</p><h2 id="operadores-l-gicos">Operadores lógicos</h2><p>‌</p><ul><li><code>!</code> No (NOT, ejemplo: <code>!a</code>)</li><li><code>&amp;&amp;</code> Y (AND, ejemplo: <code>a &amp;&amp; b</code>)</li><li><code>||</code> O (OR, ejemplo: <code>a || b</code>)</li></ul><p>Estos operadores son geniales cuando trabajamos con valores booleanos.</p><h2 id="operadores-de-asignaci-n-compuestos">Operadores de asignación compuestos</h2><p>Estos operadores son útiles para realizar asignaciones y a la vez realizar cálculos aritméticos:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Operator</th>
<th>Name</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>+=</code></td>
<td>Addition assignment</td>
<td><code>a += b</code></td>
</tr>
<tr>
<td><code>-=</code></td>
<td>Subtraction assignment</td>
<td><code>a -= b</code></td>
</tr>
<tr>
<td><code>*=</code></td>
<td>Multiplication assignment</td>
<td><code>a *= b</code></td>
</tr>
<tr>
<td><code>/=</code></td>
<td>Division assignment</td>
<td><code>a /= b</code></td>
</tr>
<tr>
<td><code>%=</code></td>
<td>Modulo assignment</td>
<td><code>a %= b</code></td>
</tr>
</tbody>
</table><!--kg-card-end: html--><h2 id="operador-ternario">Operador Ternario</h2><p>El operador ternario es el único operador en C que trabaja con 3 operandos, y es una forma corta de expresar condicionales.</p><p>Así luce:</p><p><code>&lt;condición&gt; ? &lt;expresión&gt; : &lt;expresión&gt;</code></p><p>Ejemplo:</p><p><code>a ? b : c</code>‌</p><p>Si <code>a</code> retorna <code>true</code>, entonces se ejecuta <code>b</code>, de otra forma se ejecuta <code>c</code>.</p><p>El operador ternario es funcionalmente igual que un condicional if/else, excepto que su expresión es más corta y que se puede insertar en una expresión.</p><h2 id="sizeof">sizeof</h2><p>El operador <code>sizeof</code> retorna el tamaño del operando que pases cómo argumento. Puedes pasar una variable, o incluso un tipo.</p><p>Ejemplos de uso: </p><pre><code class="language-c">#include &lt;stdio.h&gt; 
int main(void) { 
	int edad = 37; 
    print("%ld\n", sizeof(edad)); 
    print("%ld", sizeof(int)); 
}</code></pre><h2 id="precedencia-de-operadores">Precedencia de operadores</h2><p>Con todos estos operadores (y más, que no he cubierto en este artículo, incluyendo bitwise, operadores de estructura, y operadores de puntero), debemos poner atención cuando los usamos juntos en una única expresión.</p><p>Supón que tienes esta operación:</p><pre><code class="language-C">int a = 2; 
int b = 4; 
int c = b + a * a / b - a;</code></pre><p>¿Cuál es el valor de <code>c</code>? ¿Acaso se ejecuta la adición antes que la multiplicación y la división?</p><p>Hay un conjunto de reglas que nos ayudarán a resolver este acertijo.</p><p>En orden de menor a mayor precedencia, tenemos:</p><ul><li>el operador de asignación <code>=</code></li><li>los operadores binarios <code>+</code> y <code>-</code></li><li>los operadores <code>*</code> y <code>/</code></li><li>los operadores unarios <code>+</code> y <code>-</code></li></ul><p>Los operadores también tienen la regla de asociatividad, la cual siempre es de izquierda a derecha, excepto por los operadores unarios y el operador de asignación.</p><p>En:</p><pre><code class="language-C">   int c = b + a * a / b - a</code></pre><p>Primero ejecutamos <code>a * a / b</code>, del cual, dada la regla de izquierda-a-derecha, podemos separarlo en <code>a * a</code> y el resultado dividirlo entre <code>/b</code>: <code>2* 2 = 4</code>, <code>4 / 4 = 1</code>. &nbsp;</p><p>Luego podemos realizar la suma y la sustracción: <code>4 + 1 - 2</code>. El valor de <code>c</code> es <code>3</code>.</p><p>En cualquier caso, sin embargo, querrás asegurarte de darte cuenta de que puedes usar paréntesis para hacer que cualquier expresión sea más fácil de leer y de comprender.</p><p>Los paréntesis tienen prioridad más alta sobre cualquier cosa.</p><p>La expresión de más arriba puede ser reescrita como:</p><pre><code class="language-C">int c = b + ((a * a) / b) - a;</code></pre><p>Ahora no tenemos que pensar tanto en ella.</p><!--kg-card-begin: html--><h2 id="condicionales">Condicionales</h2><!--kg-card-end: html--><p>Cualquier lenguaje de programación brinda al programador opciones y la habilidad de realizar tomar decisiones.</p><p>Queremos hacer X en algunos casos, Y en otros casos.</p><p>Queremos verificar datos, y tomar decisiones en base al estado de esos datos.</p><p>C nos ofrece dos formas de hacerlo.</p><p>Primero está la declaración <code>if</code>, con su ayudante <code>else</code>, y la segunda es la declaración <code>switch</code>.</p><h2 id="if">if</h2><p>En una declaración <code>if</code>, puedes verificar si una confición es verdadera, y luego ejecutar el código que está entre los paréntesis de llave: </p><pre><code class="language-C">int a = 1; 
if (a == 1) { 
  /* haz algo*/ 
}</code></pre><p>Puedes agregar un bloque <code>else</code> para ejecutar código distinto, si en la condición original el argumento se evalúa como falso: </p><pre><code class="language-C">int a = 1; 
if (a == 2) { 
   /* haz algo */ 
} else { 
   /* haz esto otro */ 
}</code></pre><p>Debes tener cuidado con una causa común de errores: siempre usa el operador de comparación <code>==</code> cuando compares, y no el operador de asignación <code>=</code>. Si no lo haces, el condicional <code>if</code> siempre será verdad, a menos que el argumento sea <code>0</code>, por ejemplo si haces: </p><pre><code class="language-C">int a = 0; 
if (a = 0 ) { 
  /* nunca será invocado*/ 
}</code></pre><p>¿Porqué pasa esto? Porque el operador condicional buscará un resultado booleano (el resultado de la comparación), y el número <code>0</code> siempre equivale a un valor falso. Todos los demás números equivalen a verdadero, incluyendo los números negativos.</p><p>Puedes tener múltiples bloques <code>else</code> agrupando varias sentencias <code>if</code>:</p><pre><code class="language-C">int a = 1; 
if (a == 2) { 
  /* haz algo */ 
} else if ( a == 1 ) { 
  /* es otra cosa */ 
} else { 
  /* es esta otra cosa */ 
}</code></pre><h2 id="switch">switch</h2><p>Si necesitas hacer muchos bloques if/else/if para realizar una verificación, tal vez necesites revisar el valor exacto de una variable, entonces <code>switch</code> puede ser muy útil para ti.</p><p>Puedes proveer variables como condiciones, y una serie de puntos de entrada para cada caso (<code>case</code>) esperado: </p><pre><code class="language-C">int a = 1; 
switch (a) { 
  case 0: 
    /* hace algo si a = 0 */ 
  	break; 
  case 1: 
    /* hace otra cosa si a = 1 */ 
    break; 
  case 2: 
    /* hace otra cosa si a = 2 */ 
    break; 
}</code></pre><p>Necesitamos la palabra reservada <code>break</code> al final de cada caso para evitar que el siguiente caso sea ejecutado cuando el anterior haya terminado. Este efecto "cascada" puede ser útil en algunas formas creativas.</p><p>Puedes agregar un "comodín" al final, etiquetado como <code>default</code>:</p><pre><code class="language-C">default: int a = 1; 
switch (a) { 
  case 0: 
    /* hace algo si a = 0 */ 
    break; 
  case 1: 
    /* hace otra cosa si a = 1 */ 
    break; 
  case 2: 
    /* hace otra cosa si a = 2 */ 
    break; 
  default: 
    /* Aquí se manejan todos los otros casos */ 
    break; 
 }</code></pre><!--kg-card-begin: html--><h2 id="bucles">Bucles</h2><!--kg-card-end: html--><p>C nos ofrece tres formas de ejecutar bucles o también conocidos como ciclos: ciclo <strong>for</strong>, ciclo <strong>while</strong> y ciclo <strong>do while</strong>. Ellos te permiten iterar sobre arrays, pero con algunas diferencias. Veámoslas en detalle.</p><h3 id="ciclo-for">Ciclo for</h3><p>El primero y probablemente la forma más común de realizar un ciclo es el ciclo <strong>for.</strong></p><p>Al usar la palabra reservada <code>for</code> podemos definir las <em>reglas </em>del bucle por adelantado, y luego definimos el bloque de código que se ejecutará repetidamente. </p><p>Algo como esto: </p><pre><code class="language-C">for (int i = 0 ; i &lt;= 10 ; i++){ 
  /* instrucciones que serán repetidas */ 
}</code></pre><p>El bloque <code>(int i = 0; i&lt;= 10; i++)</code> contiene 3 partes de los detalles del bucle:</p><ul><li>La condición inicial (<code>int i = 0</code>)</li><li>La prueba (<code>i &lt;= 10</code>)</li><li>El incremento (<code>i++</code>)</li></ul><p>Primero definimos la variable del bucle, en este caso <code>i</code>. &nbsp;<code>i</code> es un nombre de variable común usado en los bucles, junto con <code>j</code> para los ciclos anidados (un bucle dentro de un bucle), lo cual es sólo una convención.</p><p>La variable es inicializada en el valor <code>0</code>, y se realiza la primera iteración. Luego esta es incrementada según dice la parte del incremento (<code>i++</code> en este caso, incrementando por <code>1</code>), y todo el ciclo se repite hasta que tienes el número <code>10</code>.</p><p>Dentro del bloque principal del bucle, podemos acceder a la variable <code>i</code> para saber en qué iteración vamos. Este programa imprimirá en pantalla <code>0 1 2 3 4 5 6 7 8 9 10</code>:</p><pre><code class="language-C">for (int i = 0; i &lt;= 10; i++) { 
  /* Instrucciones a repetir */ 
  printf("%u ", i); 
}</code></pre><p>Los ciclos también pueden empezar desde un número más grande y descender a uno más pequeño, como este: </p><pre><code class="language-C">for (int i = 10; i &gt; 0; i--) { 
  /* instrucciones a repetir */ 
}</code></pre><p>Además puedes incrementar la variable de iteración por 2 o cualquier otro valor : </p><pre><code class="language-C">for (int i = 0; i &lt; 1000; i = i+30){ 
  /* instrucciones a repetir */ 
}</code></pre><h3 id="ciclo-while">Ciclo While</h3><p>El <strong>ciclo while</strong> es más simple de escribir que un ciclo <code>for</code>, porque requiere un poco más de trabajo de tu parte.</p><p>En vez de definir toda la información del loop arriba, cuando inicias el loop, como lo harías en un ciclo <code>for</code>, al usar <code>while</code> sólo verificas una condición: </p><pre><code class="language-C">while ( i &lt; 10){ 
  /* hace algo cuando i es menor que 10 */ 
}</code></pre><p>Esto asume que <code>i</code> ya está definido e inicializado con un valor.</p><p>Y este bucle será un ciclo<strong> infinito</strong> a menos que incrementes la variable <code>i</code> en algún punto dentro del ciclo. Un ciclo infinito es malo porque este bloqueará el programa, sin permitir que ocurran otras cosas.</p><p>Esto es lo necesario para un ciclo while "correcto": </p><pre><code class="language-C">int i = 0; 
while ( i &lt; 10 ) { 
  /* haz algo */ 
  i++; 
}</code></pre><p>Hay una excepción a esto, la veremos en un minuto. Antes déjame presentarte <code>do while</code></p><h3 id="ciclo-do-while">Ciclo Do while</h3><p>Los ciclos while son geniales, pero existirán veces en las que necesitarás hacer una cosa particular: Tú quieres que siempre se ejecute un bloque, y luego <em>tal vez</em> repetirlo.</p><p>Esto se hace usando la palabra clave <code>do while</code>. De una forma muy similar al ciclo <code>while</code>, pero con una leve diferencia: </p><pre><code class="language-C">int i = 0; 
do { 
  /* hace algo */ 
  i++; 
} while (i &lt; 10);</code></pre><p>El bloque que contiene el comentario <code>/* hace algo*/</code>, siempre será ejecutado, a lo menos una vez, sin importar si cumple la condición de abajo.</p><p>Luego, mientras <code>i</code> sea menor que 10, repetiremos el bloque.</p><h3 id="saliendo-de-un-bucle-usando-la-palabra-reservada-break">Saliendo de un bucle usando la palabra reservada break</h3><p>En C todos los bucles tienen una forma salir, es decir de detener las repeticiones en cualquier momento, inmediatamente, sin importar las condiciones definidas para el bucle.</p><p>Esto lo logramos usando la palabra clave <code>break</code>.</p><p>Esto es útil en muchos casos. Tal vez quieras verificar el valor de una variable, por ejemplo: </p><pre><code class="language-C">for (int i = 0; i &lt;= 10; i++) { 
 if ( i == 4 &amp;&amp; algunaVariable == 10) { 
   break; 
 } 
}</code></pre><p>Tener esta opción de salida de un bucle es particularmente interesante para el ciclo <code>while</code> (y también para el <code>do while</code>), porque podemos crear bucles aparentemente infinitos que terminarán cuando ocurra una condición. Define esto dentro del bloque del ciclo: </p><pre><code class="language-C">int i = 0; 
while (1) { 
  /* haz algo */ 
  i++; 
  if ( i == 10) 
    break; 
}</code></pre><p>Es bastante común tener este tipo de bucles en C.</p><!--kg-card-begin: html--><h2 id="arreglos">Arréglos</h2><!--kg-card-end: html--><p>Un arréglo o array es una variable que almacena múltiples valores.</p><p>Todo valor en el array (en C), debe tener el mismo <strong>tipo (type)</strong>. Esto significa que tendrás arreglos de valores <code>int</code>, arreglos con valores <code>double</code>, y más.</p><p>Puedes definir un array con valores <code>int</code> así: </p><p><code>int precios[5];</code></p><p>Siempre debes especificar el tamaño del array. C no provee arreglos dinámicos listos para usar. (tienes que usar una estructura de datos como una lista enlazada para hacer eso).</p><p>Puedes usar constantes para definir el tamaño: </p><pre><code class="language-C">const int TAMANO = 5; 
int precios[TAMANO];</code></pre><p>Puedes inicializar un array al momento de su definición así: </p><pre><code class="language-C">int precios[5] = {1, 2, 3, 4, 5 };</code></pre><p>También puedes asignar valores después de su definición, de esta forma: </p><pre><code class="language-C">int precios[5]; 
precios[0] = 1; 
precios[1] = 2; 
precios[2] = 3; 
precios[3] = 4; 
precios[4] = 5;</code></pre><p>O de forma más práctica usando un ciclo: </p><pre><code class="language-C">int precios[5]; 
for (int i = 0; i&lt;5; i++) { 
  precios[i] = i + 1; 
}</code></pre><p>Puedes referenciar el item de un array usando paréntesis cuadrados después del nombre de la variable array, agregando un entero para determinar el valor del índice, así: </p><pre><code class="language-C">precios[0]; /* valor del elemento del array: 1 */ 
precios[1]; /* valor del elemento del array: 2 */</code></pre><p>Los índices de un array parten desde <code>0</code>, por lo que un array con 5 elementos, como el arreglo <code>precios</code> de más arriba tendrá elementos que parten desde <code>precios[0]</code> hasta <code>precios[4]</code>.</p><p>La parte interesante sobre los arreglos en C es que todos los elementos del array son guardados secuencialmente, uno justamente después de otro. No es algo que suceda normalmente en lenguajes de programación de más alto nivel.</p><p>Otra cosa interesante es que: el nombre de variable <code>precios</code> del array en el ejemplo anterior, es un <strong>puntero </strong>al primer elemento del array. Y como tal, se puede usar como un puntero normal.</p><p>Veremos pronto los punteros.</p><!--kg-card-begin: html--><h2 id="strings">Strings</h2><!--kg-card-end: html--><p>En C, los strings (cadenas de texto) son un tipo especial de array: un string es un array de valores <code>char</code>:</p><pre><code class="language-C">char name[6];</code></pre><p>Introduje el tipo <code>char</code> cuando toccamos el tema de los tipos, este se usa comúnmente para almacenar letras de la tabla ASCII.</p><pre><code class="language-C">char name[6] = { "M","a","u","r","o"};</code></pre><p>O de forma más conveniente con una cadena de texto literal (también llamada constante string), una secuencia de caracteres entre comillas dobles:</p><pre><code class="language-C">char name[6] = "Mauro"‌</code></pre><p>Puedes imprimir un string vía <code>printf()</code> usando <code>%s</code>:</p><p> <code>printf("%s", name);</code></p><p>Notaste que "Mauro" tiene en total 5 caracteres, pero definí el array con 6? ¿porqué? Esto es porque el último carácter de una cadena debe ser el valor <code>0</code>, el terminador de la cadena, y debemos dejar espacio para él.</p><p>Es importante mantener esto en mente, especialmente cuando manipulas strings.</p><p>Cuando hablamos de manipular strings, existe una librería estándar importante que provee C: <code>string.h</code>.</p><p>Esta librería es esencial porque abstrae muchos de los detalles de bajo nivel al trabajar, y provee un grupo de herramientas útiles.</p><p>Puedes cargar la librería agregando la siguiente línea de código en la parte superior de tu programa:</p><pre><code class="language-C">#include &lt;string.h&gt;</code></pre><p>Una vez que haces esto, tienes acceso a:</p><ul><li><code>strcpy()</code> para copiar un string sobre otro string</li><li><code>strcat()</code> para anexar un string a otro string</li><li><code>strcmp()</code> para comparar igualdad entre dos strings</li><li><code>strncpm()</code> para comparar los primeros <code>n</code> caracteres de dos strings</li><li><code>strlen()</code> para calcular el largo de un string</li></ul><p>Y muchos más</p><!--kg-card-begin: html--><h2 id="punteros">Punteros</h2><!--kg-card-end: html--><p>Los punteros son una de las partes más confusas/desafiantes de C, en mi opinión. Especialmente si eres nuevo en los lenguajes de programación, pero también si vienes de lenguajes de programación de alto nivel como Python o JavaScript.</p><p>En esta sección quiero introducirlos de la forma más sencilla, pero completa posible.</p><p>Un puntero es la dirección de un bloque de memoria que contiene una variable.</p><p>Cuando declaras un número entero como este:</p><pre><code class="language-C">  int edad = 37;</code></pre><p>Podemos usar el operador <code>&amp;</code> para obtener el valor de la dirección en memoria de la variable: </p><pre><code class="language-C">printf("%p", &amp;edad ); /* 0x7ffe3425bcac */</code></pre><p>Usé el formato <code>%p</code> especificado en <code>printf()</code> para imprimir el valor de la dirección.</p><p>Podemos asignar la dirección a una variable: </p><p><code>int *direccion = &amp;edad;</code></p><p>Usando <code>int *direccion</code> en la declaración, no estamos declarando una variable tipo entero, sino el <strong>puntero a un entero</strong>. </p><p>Podemos usar el operador de puntero <code>*</code> para obtener el valor de una variable a la que apunta una dirección: </p><pre><code class="language-C">int edad = 37; 
int *direccion = &amp;edad; 
printf("%u", *direccion); /* 37 */</code></pre><p>Esta vez estamos usando el operador de puntero otra vez, pero como no es una declaración, esta vez significa "El valor de la variable a la que apunta el puntero".</p><p>En este ejemplo, nosotros declaramos una variable <code>edad</code> y usamos un puntero para inicializar el valor: </p><pre><code class="language-C">int edad; 
int *direccion = &amp;edad; 
*direccion = 37; 
printf("%u"; *direccion);</code></pre><p>Cuando trabajes con C, te darás cuenta que muchas cosas están construidas sobre este simple concepto. Así que debes asegurarte de estar familiarizado con él, lo cual se te facilitará al realizar los ejemplos por tu cuenta.</p><p>Los punteros son una gran oportunidad de aprendizaje, porque nos obligan a pensar en las direcciones de memoria y cómo están organizados los datos.</p><p>Los arrays son un ejemplo, cuando declaras un array:</p><pre><code class="language-C">int precios[3] = { 5, 4, 3 };</code></pre><p>La variable <code>precios</code> es de hecho, un puntero al primer elemento del array. Puedes obtener el valor del primer item usando la función<code>printf()</code> &nbsp;de la siguiente forma:</p><p> <code>printf("%u", *precios); &nbsp;/* 5 */</code></p><p>Lo genial es que podemos obtener el segundo item sumando 1 al puntero <code>precios</code>: </p><p><code>printf("%u%", *(precios + 1); /* 4 */</code></p><p>De la misma forma podemos obtener los valores que siguen.</p><p>También podemos hacer muchas manipulaciones y operaciones de strings, dado que internamente, son arreglos de caracteres.</p><p>También tenemos muchas otras formas de aplicarlo, incluyendo pasar la referencia a un objeto o una función para evitar consumir más recursos al copiarlo.</p><!--kg-card-begin: html--><h2 id="funciones">Funciones</h2><!--kg-card-end: html--><p>Las funciones son formas en las que podemos estructurar nuestro código en subrutinas a las cuales podremos:</p><ol><li>Darles un nombre</li><li>Llamarlas (invocarlas) cuando lo necesitemos</li></ol><p>Al comenzar con tu primer programa ("Hola Mundo"), inmediatamente comenzaste a usar las funciones de C:</p><pre><code class="language-C">#include &lt;stdio.h&gt; 
int main(void) { 
   printf("Hola Mundo"); 
}</code></pre><p>La función <code>main()</code> es una muy importante, y es el punto de entrada a un programa en C.</p><p>Aquí hay otra función:</p><pre><code class="language-C">void hazAlgo(int valor) { 
   printf("%u", valor); 
}</code></pre><p>Las funciones tienen 4 aspectos importantes:</p><ol><li>Tienen un nombre, para que podamos invocarlas("llamarlas") en el momento que la necesitemos.</li><li>Especifican un valor de retorno</li><li>Pueden tener argumentos</li><li>Tienen un cuerpo envuelto en paréntesis de llave (<code>{}</code>)</li></ol><p>El cuerpo de la función es el conjunto de instrucciones que se ejecutará cada vez que se invoca la función.</p><p>Si la función no tiene valor de retorno, puedes usar la palabra reservada <code>void</code> antes del nombre de la función. De otra forma debes especificar el tipo de valor que retornará (<code>int</code> para enteros, <code>float</code> para decimales de punto flotante, <code>const char * </code>para un string, etc).</p><p>No puedes retornar más de un valor desde una función.</p><p>Una función puede tener argumentos. Estos son opcionales. Si no tiene argumentos, debes colocar la palabra reservada <code>void</code>, de la siguiente forma: </p><pre><code class="language-C">void hazAlgo(void) { /* ... */ }</code></pre><p>En este caso, cuando invocamos la función, la llamaremos sin elementos dentro del paréntesis:</p><pre><code class="language-C">hazAlgo();</code></pre><p>Si tenemos un parámetro, especificamos el tipo y el nombre del parámetro así:</p><pre><code class="language-C">void hazAlgo(int valor) { /* ... */ }</code></pre><p>Cuando invocamos la función, le pasaremos ese parámetro entre paréntesis de la siguiente forma: </p><pre><code class="language-C">hazAlgo(3);</code></pre><p>Podemos tener múltiples parámetros. De ser así, debemos separarlos usando una coma, tanto en la declaración como en la invocación:</p><pre><code class="language-C">void hazAlgo(int valor1, int valor2) { 
   /* ... */ 
} 
hazAlgo(3, 4);</code></pre><p>Los parámetros son pasados a la función como <strong>copias</strong>, esto significa que si modificas el <code>valor1</code>, este valor sólo se modificará localmente, es decir dentro del cuerpo de la función. El valor afuera, que fue pasado al momento de la invocación no cambiará.</p><p>Si pasas un <strong>puntero</strong> como parámetro, podrás modificar el valor de la variable, esto porque ahora podrás acceder directamente a su dirección en memoria.</p><p>No puedes definir un valor por defecto para un parámetro. C++ puede hacerlo ( y por lo tanto los programas en lenguaje Arduino), pero C no puede.</p><p>Asegúrate de definir la función antes de llamarla, o el compilador enviará un mensaje de advertencia:</p><pre><code class="language-C">➜  ~ gcc hola.c -o hola; ./hola 
hola.c:14:3: warning: implicit declaration of ç
     function 'hazAlgo' is invalid in C99 
     [-Wimplicit-function-declaration] 
   hazAlgo(3, 4); 
   ^
hola.c:17:6: error: conflicting types for
      'hazAlgo'
void hazAlgo(int valor1, char valor2) {
     ^
hola.c:13:3: note: previous implicit declaration
      is here
  hazAlgo(3, 4);
  ^
1 warning and 1 error generated.</code></pre><p>Cómo he mencionado anteriormente la alerta que hemos recibido tiene que ver con el orden.</p><p>El error se trata de otra cosa relacionada. Ya que C no puede "ver" la declaración de la función antes de la invocación entonces debe hacer suposiciones. Y asume que la función retorna un <code>int</code>, pero la función retorna <code>void</code> y a esto se debe el error.</p><p>Si cambias la definición de la función a:</p><pre><code class="language-C">int hazAlgo(int valor1, int valor2) {
  printf("%d %d\n", valor1, valor2);
  return 1;
}
</code></pre><p>Sólo obtenemos una advertencia y no el error:</p><pre><code>➜  ~ gcc hello.c -o hello; ./hello
hello.c:14:3: warning: implicit declaration of
      function 'doSomething' is invalid in C99
      [-Wimplicit-function-declaration]
  doSomething(3, 4);
  ^
1 warning generated.</code></pre><p>En cualquier caso, asegúrate de declarar la función antes de usarla. Ya sea moviendo la función hacia arriba, o agregando el prototipo de función en un archivo de cabecera.</p><p>Dentro de una función puedes declarar variables.</p><pre><code class="language-C">void hasAlgo(int valor) { 
   int dobleValor = valor * 2; 
}</code></pre><p>Una variable es creada al momento de la invocación y se destruye cuando la función termina su ejecución, la variable no será visible desde el exterior.</p><p>Dentro de una función, puedes llamar a la función en sí misma. Esto se llama <strong>recursión</strong> y es algo que ofrece oportunidades peculiares.</p><!--kg-card-begin: html--><h2 id="entradas-y-salidas">Entradas y salidas (Input Output - IO)</h2><!--kg-card-end: html--><p>C es un lenguaje pequeño, y el "núcleo" de C no incluye funcionalidades de entrada y salida, "Input/Output" (I/O).</p><p>Por supuesto, esto no es algo único de C. Es común para el núcleo de un lenguaje ser agnóstico de I/O.</p><!--kg-card-begin: markdown--><p>En el caso de C, la librería estándar nos provee Input/Output vía un conjunto de funciones definidas en el archivo de cabecera <code>stdio.h</code></p>
<!--kg-card-end: markdown--><p>Puedes importar esta librería usando <code>include &lt;stdio.h&gt;</code> en la parte superior de tu archivo C:</p><!--kg-card-begin: markdown--><pre><code>#include &lt;stdio.h&gt;
</code></pre>
<!--kg-card-end: markdown--><p>Esta librería nos provee diversas funciones:</p><!--kg-card-begin: markdown--><ul>
<li><code>printf()</code></li>
<li><code>scanf()</code></li>
<li><code>sscanf()</code></li>
<li><code>fgets()</code></li>
<li><code>fprintf()</code></li>
</ul>
<!--kg-card-end: markdown--><p>Antes de describir qué hacen estas funciones, quiero tomarme un minuto para habler sobre los <strong>flujos I/O </strong>(I/O streams) [Flujos de entrada y salida].</p><p>Tenemos 3 tipos de flujos de E/S en C:</p><!--kg-card-begin: markdown--><ul>
<li><code>stdin</code> (standard input) [entrada estandar]</li>
<li><code>stdout</code> (standard output) [salida estandar]</li>
<li><code>stderr</code> (standar error) [error estandar]</li>
</ul>
<!--kg-card-end: markdown--><p>Con las funciones I/O siempre trabajaremos con flujos. Un flujo es una interfaz de alto nivel que representa un dispositivo o un archivo. Desde el punto de vista de C, no tenemos ninguna diferencia al leer desde un archivo o leer desde la línea de comandos: ambos son un flujo I/O en cualquier caso.</p><p>Esto es algo para tener presente.</p><!--kg-card-begin: markdown--><p>Algunas funciones están diseñadas para trabajar en un flujo específico, como <code>printf()</code>, el cual usamos para imprimir caracteres al <code>stdout</code>. Al usar su contraparte más general <code>fprintf()</code>, podemos específicar a cual flujo escribiremos.</p>
<!--kg-card-end: markdown--><p>Ya que empecé hablando de <code>printf()</code>, hagámos su introducción ahora.</p><p><code>printf()</code> es una de las primeras funciones que usarás al aprender a programar en C. </p><p>En su forma de uso más simple le pasamos una cadena de texto literal:</p><pre><code class="language-c">printf("hola!");
</code></pre><p>... y el programa mostrará en consola el contenido de la cadena de texto.</p><p>También puedes imprimir el valor de una variable. Pero es algo complicado ya que necesitas agregar un carácter especial, un carácter de relleno que cambia dependiendo del tipo de la variable. Por ejemplo, usamos <code>%d</code> para un dígito decimal entero con signo:</p><pre><code class="language-C">int edad = 37;

printf("Mi edad es %d", edad);
</code></pre><p>Podemos imprimir más de una variable usando comas:</p><pre><code class="language-C">int edad_ayer = 37;
int edad_hoy = 36;

printf("Ayer mi edad era %d y hoy es %d", edad_ayer, edad_hoy);
</code></pre><p>Hay otros especificadores de formato como <code>%d</code>:</p><ul><li><code>%c</code> para caracteres</li><li><code>%s</code> para caracteres</li><li><code>%f</code> para números de punto flotante</li><li><code>%p</code> para punteros</li></ul><p>... y varios más.</p><p>Podemos usar caracteres de escape en <code>printf()</code>, como <code>\n</code> que podemos usar para crear una nueva línea en el resultado de salida.</p><h3 id="scanf-"><strong><strong><code>scanf()</code></strong></strong></h3><p><code>printf()</code> se utiliza cómo una función de salida. Ahora quiero presentarte una función de entrada para que podamos realizar todas las acciones I/O (de entrada y salida): <code>scanf()</code>.</p><p>Esta función se utiliza para obtener un valor de parte del usuario mediante la consola.</p><p>Debemos definir una variable que tomará el valor que obtuvimos desde la entrada:</p><pre><code class="language-C">int edad;
</code></pre><p>Luego la llamamos <code>scanf()</code> pasándole 2 argumentos (el formato de la variable y la dirección de variable):</p><pre><code class="language-C">scanf("%d", &amp;edad);
</code></pre><p>Si queremos obtener un string como entrada, recuerda que el nombre de un string es un puntero a el primer carácter, por lo que no necesitas usar el carácter al inicio <code>&amp;</code>:</p><pre><code class="language-c">char nombre[20];
scanf("%s", nombre);
</code></pre><p>Aquí un pequeño programa que utiliza ambos <code>printf()</code> y <code>scanf()</code>:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
  char nombre[20];
  printf("Escribe tu nombre: ");
  scanf("%s", nombre);
  printf("te llamas %s", nombre);
}
</code></pre><!--kg-card-begin: html--><h2 id="scope">Alcance de las variables</h2><!--kg-card-end: html--><p>Cuando defines una variable en un programa C, dependiendo de dónde lo declares, va a tener un alcance distinto (<strong>scope</strong>).</p><p>Esto significa que estará disponible en algunos lugares pero no en otros.</p><p>La ubicación de dónde es declarada, determina los 2 tipo de variables:</p><ul><li><strong>v<strong>ariables</strong> g<strong>lobal</strong>es<strong> </strong></strong></li><li><strong><strong>variables</strong> <strong>locales</strong></strong></li></ul><p>Esta es la diferencia: una variable declarada dentro de una función es una variable local, así:</p><pre><code class="language-c">int main(void) {
  int edad = 37;
}
</code></pre><p>Las variables locales sólo son accesibles desde adentro de la función y cuando la función termina, dejan de existir, es decir, son liberadas de la memoria, con algunas excepciones.</p><p>Una variable definida fuera de una función se conoce como variable global cómo en el siguiente ejemplo:</p><pre><code class="language-c">int edad = 37;

int main(void) {
  /* ... */
}
</code></pre><p>Las variables globales son accesibles desde cualquier función del programa y están disponibles por toda la ejecución del programa hasta que este concluye.</p><p>Mencioné que las variables locales no están disponibles luego de finalizar la función que las contenga.</p><p>La razón de esto es que las variables locales por defecto, son declaradas en la <strong>pila </strong>(<strong>stack</strong>),<strong> </strong>a menos que las asignes manualmente al almacenamiento dinámico (<strong>heap</strong>) usando punteros. Pero entonces tendrás que administrar el uso de memoria tú mismo. </p><!--kg-card-begin: html--><h2 id="variables-estaticas">Variables estáticas</h2><!--kg-card-end: html--><p>Dentro de una función puedes inicializar una <strong>variable estática</strong> usando la palabra reservada <code>static</code>. He dicho "dentro de una función" ya que las variables globales son estáticas por defecto, así que no hay necesidad de agregar la palabra clave <code>static</code>.</p><p>¿Qué es una variable estática? Una variable estática es inicializada a <code>0</code> si no se le asigna ningún valor y retiene su valor en todas las llamadas o invocaciones de función.</p><p>Considera esta función:</p><pre><code class="language-C">int incrementarEdad() {
  int edad = 0;
  edad++;
  return edad;
}
</code></pre><p>Si llamamos <code>incrementarEdad()</code> vamos a obtener <code>1</code> cómo valor de retorno, si la seguimos invocando, simpre obtendremos <code>1</code>, debido a que <code>edad</code> es una variable local y se reinicia su valor a <code>0</code> en cada llamada o invocación.</p><p>Si cambiamos la función a:</p><pre><code class="language-C">int incrementarEdad() {
  static int edad = 0;
  edad++;
  return edad;
}
</code></pre><p>Ahora cada vez que llamemos a esta función, vamos a obtener un valor incremental:</p><pre><code class="language-C">printf("%d\n", incrementarEdad());
printf("%d\n", incrementarEdad());
printf("%d\n", incrementarEdad());
</code></pre><p>nos arrojará</p><pre><code>1
2
3
</code></pre><p>También podemos omitir la inicialización de <code>edad</code> a <code>0</code> en la línea <code>static int edad = 0</code> y sólo escribir <code>static int edad;</code> dado que las variables estáticas reciben automáticamente el valor <code>0</code> al ser creadas.</p><p>También podemos usar arreglos estáticos, en este caso cada ítem individual en el arreglo es inicializado a <code>0</code> automáticamente:</p><pre><code class="language-C">int incrementarEdad() {
  static int edades[3];
  edades[0]++;
  return edades[0];
}
</code></pre><h2 id="variables-globales"><strong>V<strong>ariables</strong> g<strong>lobal</strong>es<strong> </strong></strong></h2><p>En esta sección quiero hablar más acerca de la diferencia entre <strong>variables globales y locales</strong>. </p><p>Una <strong>variable local</strong> se define dentro de una función y sólo se encuentra disponible dentro de esa función.</p><p>Así:</p><pre><code class="language-C">#include &lt;stdio.h&gt;

int main(void) {
  char j = 0;
  j += 10;
  printf("%u", j); //10
}
</code></pre><p><code>j</code> no está disponible en cualquier lugar fuera de la función <code>main</code>.</p><p>Una <strong>variable global</strong> se define fuera de las funciones de la siguente forma:</p><pre><code class="language-C">#include &lt;stdio.h&gt;

char i = 0;

int main(void) {
  i += 10;
  printf("%u", i); //10
}
</code></pre><p>Se puede tener acceso a una variable global desde cualquier función en el programa, además no se limita a la lectura del valor que almacena sino que este valor puede ser modificado desde cualquier función.</p><p>Debido a esto, las variables globales son una de las formas en que podemos compartir los mismos datos entre funciones.</p><p>La principal diferencia con las variables locales es que el espacio de memoria que se asigna a una variable local se libera una vez que la función termina. En cambio, el espacio de memoria de las variables locales sólo es liberado cuando termina el programa.</p><!--kg-card-begin: html--><h2 id="definiciones-de-tipos">Definiciones de tipos</h2><!--kg-card-end: html--><p>En C, la palabra reservada <code>typedef</code> nos permite definir nuevos tipos de datos.</p><p>Tomando los tipos incluidos en C como base, podemos crear nuestros propios tipos de datos usando la siguiente sintaxis:</p><pre><code class="language-C">typedef existingtype NUEVOTIPO
</code></pre><p>Por convención, es común utilizar mayúsculas para definir un nuevo tipo, esto para poder distinguirlo y reconocerlo como un tipo de dato con mayor facilidad.</p><p>Por ejemplo, podemos definir un nuevo tipo de dato <code>NUMERO</code> como <code>int</code>:</p><pre><code class="language-C">typedef int NUMERO
</code></pre><p>y una vez que lo hayas hecho podrás definir variables de tipo <code>NUMERO</code>:</p><pre><code class="language-C">NUMERO uno = 1;
</code></pre><p>¿Ahora bien, te preguntarás porqué hacer esto? ¿Porque no sólo utilizar el tipo <code>int</code> en su lugar?</p><p>Bueno, <code>typedef</code> se vuelve muy útil cuando se le acompaña de dos cosas: tipos enumerados y estructuras.</p><!--kg-card-begin: html--><h2 id="tipos-enumerados">Tipos enumerados</h2><!--kg-card-end: html--><p>Usando las palabras reservadas <code>typedef</code> y podemos definir un tipo que puede tener uno u otro valor. Es uno de los más importantes usos de la palabra reservada <code>enumtypedef</code>. </p><p>Esta es la sintaxis de la declaración un tipo enumerado:</p><pre><code class="language-c">typedef enum {
  //...valores
} NOMBRETIPO;
</code></pre><p>El tipo enumerado que creemos es usualmente por convención definido en mayúsculas .</p><p>Aquí, un ejemplo sencillo:</p><pre><code class="language-c">typedef enum {
  true,
  false
} BOOLEAN;
</code></pre><p>Aunque C ya cuenta con un tipo <code>bool</code>, lo anterior nos sirve como ejemplo explicativo.</p><p>Otro ejemplo son los días de la semana como tipo de datos:</p><pre><code class="language-C">typedef enum {
  lunes,  
  martes,
  miercoles,
  jueves,
  viernes,
  sabado,
  domingo
} DIASEMANA;
</code></pre><p>Y aquí un programa simple que utiliza este tipo enumerado:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

typedef enum {
  lunes,  
  martes,
  miercoles,
  jueves,
  viernes,
  sabado,
  domingo
} DIASEMANA;

int main(void) {
  DIASEMANA dia = lunes;

  if (day == lunes) {
    printf("Es lunes!"); 
  } else {
    printf("No es lunes"); 
  }
}
</code></pre><p>Internamente cada ítem en una definición de un <code>enum</code>, se empareja con un entero. Por lo que en este ejemplo <code>lunes</code> es <code>0</code>, es y <code>martes</code> es <code>1</code> así sucesivamente.</p><p>Lo que quiere decir que la condición la pudimos haber escrito así: <code>if (dia==0)</code> y no así: <code>if (dia == lunes)</code>, sin embargo, es una sintaxis más conveniente, legible y fácil de razonar para nosotros humanos usar palabras en lugar de números.</p><!--kg-card-begin: html--><h2 id="estructuras">Estructuras</h2><!--kg-card-end: html--><p>Usando la palabra reservada <code>struct</code> podemos crear estructuras de datos complejas usando los tipos básicos de C.</p><p>Una estructura es una colección de valores de tipos distintos. Los arreglos en C están limitados a un sólo tipo de datos, por lo que las estructuras pueden ser muy útiles en muchos casos.</p><p>Esta es la sintaxis para definir una estructura:</p><pre><code class="language-c">struct &lt;nombredeestructura&gt; {
  //...variables
};
</code></pre><p>Ejemplo:</p><pre><code class="language-c">struct persona {
  int edad;
  char *nombre;
};
</code></pre><p>Puedes declarar variables que sean del tipo de la estructura que has definido, al especificar el nombre de la variable luego de la llave que cierra y antes del punto y coma, así:</p><pre><code class="language-c">struct persona {
  int edad;
  char *nombre;
} flavio;
</code></pre><p>O para múltiples variables, así:</p><pre><code class="language-c">struct persona {
  int edad;
  char *nombre;
} flavio, gente[20];
</code></pre><p>En este caso declaron una sóla variable <code>flavio</code> de tipo <code>persona</code> y un arreglo <code>gente</code> de 20 personas.</p><p>También podemos declarar las variables usando esta sintaxis:</p><pre><code class="language-c">struct persona {
  int edad;
  char *nombre;
};

struct persona flavio;
</code></pre><p>Podemos inicializar una estructura en la misma línea en que hemos declarado la variable:</p><pre><code class="language-c">struct persona {
  int edad;
  char *nombre;
};

struct persona flavio = { 37, "Flavio" };
</code></pre><p>y una vez que hayamos definido una estructura, podemos tener acceso a los valores que contiene usando un punto (notació &nbsp;de punto):</p><pre><code class="language-c">struct persona {
  int edad;
  char *nombre;
};

struct persona flavio = { 37, "Flavio" };
printf("%s, edad %u", flavio.nombre, flavio.edad);
</code></pre><p>Usando el punto también podemos editar los valores:</p><pre><code class="language-c">struct persona {
  int edad;
  char *nombre;
};

struct persona flavio = { 37, "Flavio" };

flavio.edad = 38;
</code></pre><p>Las estructuras son muy útiles porque podemos moverlas de un lado a otro o pasarlas como parámetros o valores de retorno en funciones o embedir variables y cada variable tiene una etiqueta.</p><p>Es importante mencionar que las estructuras se <strong>"pasan como copia"</strong>, a menos que por supuesto pasemos tambien un puntero, en tal caso "pasa como referencia". </p><p>Al trabajar con estructuras, podemos simplificar el código usando la palabra reservada <code>typedef</code>.</p><p>Veamos un ejemplo:</p><pre><code class="language-c">typedef struct {
  int edad;
  char *nombre;
} PERSONA;
</code></pre><p>El nombre de la estructura que creamos usando <code>typedef</code> es usualmente y por convención, escrita en mayúsculas.</p><p>Ahora podemos declarar nuevas variables <code>persona</code> así:</p><pre><code class="language-c">PERSONA flavio;
</code></pre><p>y &nbsp;las podemos inicializar en la misma línea en que fueron declaradas, así:</p><pre><code class="language-c">PERSONA flavio = { 37, "Flavio" };
</code></pre><!--kg-card-begin: html--><h2 id="parametros-de-linea-de-comandos">Parámetros de línea de comandos</h2><!--kg-card-end: html--><p>En tus programas escritos en C podrías necesitar aceptar parámetros desde la línea de comandos cuando arrancas su ejecución.</p><p>Para casos de uso simples, lo único que vas a necesitar es modificar la firma de función <code>main()</code> de:</p><pre><code class="language-c">int main(void)
</code></pre><p>a:</p><pre><code class="language-c">int main (int argc, char *argv[])
</code></pre><p><code>argc</code> es un número entero que representa el número de parámetros que fueron proporcionados mediante la línea de comandos.</p><p><code>argv</code> es un arreglo de strings (cadenas de caracteres).</p><p>Al arrancar el programa se tiene acceso a los argumentos de los 2 parámetros.</p><p>Cabe mencionar que siempre habrá por lo menos un ítem en el arreglo <code>argv</code>: el nombre del programa.</p><p>Tomemos el ejemplo del compilador C que usamos para ejecutar nuestros problemas, así:</p><pre><code class="language-sh">gcc hola.c -o hola
</code></pre><p>Si este fuera nuestro programa, <code>argc</code> sería equivalente a 4 y <code>argv</code> una matriz (arreglo) que contiene</p><ul><li><code>gcc</code></li><li><code>hello.c</code></li><li><code>-o</code></li><li><code>hello</code></li></ul><p>Escribamos un programa que imprima los argumentos que recibe:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main (int argc, char *argv[]) {
  for (int i = 0; i &lt; argc; i++) {
    printf("%s\n", argv[i]);
  }
}
</code></pre><p>Si el nombre de nuestro programa es <code>hello</code> y lo ejecutamos así: <code>./hello</code>, obtendríamos esto como salida:</p><pre><code>./hello
</code></pre><p>Si pasamos algunos parámetros aleatorios, como este: obtendríamos esta salida a la terminal:<code>./hello a b c</code></p><pre><code>./hello
a
b
c
</code></pre><p>Este sistema funciona muy bien para casos de uso simples. Para necesidades más complejas, existen paquetes de uso común como <strong><strong>getopt</strong></strong>.</p><!--kg-card-begin: html--><h2 id="archivos-de-cabecera">Archivos de cabecera</h2><!--kg-card-end: html--><p>Los programas simples se pueden poner en un solo archivo. Pero cuando tu programa crezca, será imposible mantenerlo todo en un solo archivo.</p><p>Puede mover partes de un programa a archivos independientes. A continuación, se crea un <strong><strong>archivo de </strong>cabecera</strong>.</p><p>Un archivo de cabecera se parece a un archivo C normal, excepto que termina con en <code>.h</code> lugar de <code>.c</code>. En lugar de las implementaciones de las funciones y las otras partes de un programa, contiene las <strong>d<strong>eclaraciones</strong>.</strong></p><p>Ya usaste archivos de encabezado cuando usaste la función <code>printf()</code>, o alguna otra función de E/S, y para usarlo tuviste que escribir:	</p><pre><code class="language-c">#include &lt;stdio.h&gt;
</code></pre><p></p><p><code>#include</code> es una <strong>directiva de preprocesador</strong>.</p><p>El preprocesador va y busca el archivo <code>stdio.h</code> en la biblioteca estándar porque usó corchetes alrededor de él. Para incluir tus propios archivos de encabezado, usarás comillas, como esta:</p><figure class="kg-card kg-code-card"><pre><code class="language-c">#include "hola.h"
</code></pre><figcaption>_</figcaption></figure><p>Lo anterior buscará <code>hola.h</code> en la carpeta actual.</p><p>También puedes utilizar estructura de carpetas para bibliotecas:</p><pre><code class="language-c">#include "proyecto-hola/hola.h"
</code></pre><p>Veamos un ejemplo. Este programa calcula los años transcurridos desde un año determinado:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int calcularEdad(int anio) {
  const int ANIO_ACTUAL = 2020;
  return ANIO_ACTUAL - anio;
}

int main(void) {
  printf("%u", calcularEdad(1983));
}
</code></pre><p>Supongamos que quiero mover la función <code>calcularEdad</code> a un archivo separado.</p><p>Creo un archivo:<code>calcular_edad.c</code></p><pre><code class="language-c">int calcularEdad(int anio) {
  const int ANIO_ACTUAL = 2020;
  return ANIO_ACTUAL - anio;
}
</code></pre><p>Y un archivo <code>calcular_edad.h</code> donde pongo el prototipo de la función, que es la misma que la función en el archivo con <code>.c</code>, excepto el cuerpo de la <em><em>función</em>:</em></p><pre><code class="language-c">int calculateAge(int year);
</code></pre><p>Ahora en el archivo <code>.c</code> principal podemos ir y eliminar la definición de la función <code>calculateAge()</code>, y luego podemos importar el archivo <code>calculate_age.h</code>, lo que hará que la función <code>calculateAge()</code> esté disponible:</p><pre><code class="language-c">#include &lt;stdio.h&gt;
#include "calculate_age.h"

int main(void) {
  printf("%u", calculateAge(1983));
}
</code></pre><p>No olvides que, para compilar un programa compuesto por varios archivos, debes enumerarlos todos (pasarlos como parámetros) en la línea de comandos, así:</p><pre><code class="language-sh">gcc -o main main.c calculate_age.c
</code></pre><p>Para configuraciones más complejas, es necesario un Makefile para decirle al compilador cómo compilar el programa.</p><!--kg-card-begin: html--><h2 id="preprocesador">El preprocesador</h2><!--kg-card-end: html--><p>El preprocesador es una herramienta que nos ayuda mucho a la hora de programar con C. Es parte del estándar C, al igual que el lenguaje, el compilador y la biblioteca estándar.</p><p>El preprocesador analiza nuestro programa y se asegura de que el compilador obtenga todas las cosas que necesita antes de continuar con el proceso.</p><p>¿Qué hace en la práctica?</p><p>Por ejemplo, busca todos los archivos de encabezado que se incluyen con la directiva <code>#include</code>.</p><p>También examina todas las constantes que definió usando <code>#define</code> y las sustituye por su valor real.</p><p>Eso es solo el comienzo. Mencioné esas 2 operaciones porque son las más comunes. El preprocesador puede hacer mucho más.</p><p>¿Te diste cuenta de que <code>#include</code> y <code>#define</code> tienen un <code>#</code> un al principio? Esto es común en todas las directivas del preprocesador. Si una línea comienza con <code>#</code>, el preprocesador se encarga de ello.</p><h3 id="condicionales"><strong><strong>Condicionales</strong></strong></h3><p>Una de las cosas que podemos hacer es usar condicionales para cambiar la forma en que se compilará nuestro programa, dependiendo del valor de una expresión.</p><p>Por ejemplo, podemos comprobar si la constante <code>DEBUG</code> es <code>0</code>:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

const int DEBUG = 0;

int main(void) {
#if DEBUG == 0
  printf("No estoy depurando\n");
#else
  printf("Estoy depurando\n");
#endif
}
</code></pre><h3 id="constantes-simb-licas"><strong><strong>Constantes simbólicas</strong></strong></h3><p>Podemos definir una <strong><strong>constante simbólica</strong></strong>:</p><pre><code class="language-c">#define VALUE 1
#define PI 3.14
#define NAME "Flavio"
</code></pre><p>Cuando usamos NAME o PI o VALUE en nuestro programa, el preprocesador reemplaza su nombre con el valor antes de ejecutar el programa.</p><p>Las constantes simbólicas son muy útiles porque podemos dar nombres a los valores sin crear variables en el momento de la compilación.</p><h3 id="macros"><strong><strong>Macros</strong></strong></h3><p>Con <code>#define</code> también podemos definir una <strong>macro</strong>. La diferencia entre una macro y una constante simbólica es que una macro puede aceptar un argumento y normalmente contiene código, mientras que una constante simbólica es un valor:</p><pre><code class="language-c">#define POTENCIA(x) ((x) * (x))
</code></pre><p>Observe los paréntesis alrededor de los argumentos: esta es una buena práctica para evitar problemas cuando se reemplaza la macro en el proceso de pre-compilación.</p><p>Luego podemos usarlo en nuestro código de la siguiente manera:</p><pre><code class="language-c">printf("%u\n", POTENCIA(4)); //16
</code></pre><p>La gran diferencia con las funciones es que las macros no especifican el tipo de sus argumentos o valores devueltos, lo que puede ser útil en algunos casos.</p><p>Las macros, sin embargo, se limitan a definiciones de una línea.</p><h3 id="if-defined">If defined</h3><p>Podemos comprobar si se define una constante simbólica o una macro usando <code>#ifdef</code>:</p><pre><code class="language-c">#include &lt;stdio.h&gt;
#define VALOR 1

int main(void) {
#ifdef VALOR
  printf("Valor está definido\n");
#else
  printf("Valor no está definido\n");
#endif
}
</code></pre><p>También tenemos <code>#ifndev</code> comprobar lo contrario (macro no definida).</p><p>También podemos usar <code>#if defined</code> y <code>#if !defined</code> para realizar la misma tarea.</p><p>Es común envolver algún bloque de código en un bloque como este:</p><pre><code class="language-c">#if 0

#endif
</code></pre><p>para evitar temporalmente que se ejecute o para usar una constante simbólica DEBUG:</p><pre><code class="language-c">#define DEBUG 0

#if DEBUG
  //este código sólo se envía al compilador
  //si DEBUG no es igual a 0
#endif
</code></pre><h3 id="constantes-simb-licas-predefinidas-que-puedes-usar"><strong><strong>Constantes simbólicas predefinidas que puedes usar</strong></strong></h3><p>El preprocesador también define una serie de constantes simbólicas que puede utilizar, identificadas por los 2 guiones bajos que encuentras antes y después del nombre, entre las que se incluyen:</p><ul><li><code>__LINE__</code> se traduce a la línea actual en el archivo de código fuente</li><li><code>__FILE__</code> se traduce en el nombre del archivo</li><li><code>__DATE__</code> se traduce a la fecha de compilación, en el formato<code>Mmm gg aaaa</code></li><li><code>__TIME__</code> se traduce en el tiempo de compilación, en el formato <code>hh:mm:ss</code>.</li></ul><!--kg-card-begin: html--><h2 id="conclusion">Conclusión</h2><!--kg-card-end: html--><p>¡Muchas gracias por leer este manual!</p><p>Espero que te inspire a saber más sobre C.</p><p>Para obtener más tutoriales, consulte mi blog <a href="https://flaviocopes.com/">flaviocopes.com</a>.</p><p>Sígueme en Twitter <a href="https://twitter.com/flaviocopes">@flaviocopes</a>.<br></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Operador C: Operadores lógicos en programación en C ]]>
                </title>
                <description>
                    <![CDATA[ En este artículo, aprenderás sobre los tres operadores lógicos en C. Primero, explicaré qué son los operadores en programación y listaré los diferentes tipos de operadores disponibles en C. Luego, aprenderás el papel que tienen los operadores lógicos y cómo usarlos con la ayuda de ejemplos de código en el ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/operador-c-operadores-logicos-de-programacion-en-c/</link>
                <guid isPermaLink="false">65ff552524402003fe4e4eb0</guid>
                
                    <category>
                        <![CDATA[ programacion c ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Thu, 28 Mar 2024 21:48:55 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/03/pexels-mikael-blomkvist-6476587.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/c-operator-logic-operators-in-c-programming/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">C Operator – Logic Operators in C Programming</a>
      </p><p><strong>En este artículo, aprenderás sobre los tres operadores lógicos en C.</strong></p><p>Primero, explicaré qué son los operadores en programación y listaré los diferentes tipos de operadores disponibles en C.</p><p>Luego, aprenderás el papel que tienen los operadores lógicos y cómo usarlos con la ayuda de ejemplos de código en el camino.</p><p>¡Comencemos! ¿Qué es un Operador en Programación de Computadoras?</p><p>En programación de computadoras, un operador es un carácter, símbolo, palabra clave o combinación de estos. Determina qué acción se realiza en uno o más operandos.</p><p>Un operando es un elemento de datos individual que es manipulado por el operador.</p><p>Cada lenguaje de programación de alto nivel define estos caracteres integrados y los utiliza para indicar al compilador que realice operaciones aritméticas, relacionales o lógicas que manipulan elementos de datos y luego devuelven un resultado final. </p><h2 id="-cu-les-son-los-diferentes-tipos-de-operadores-en-la-programaci-n-en-c">¿Cuáles son los Diferentes Tipos de Operadores en la Programación en C?</h2><p>En la programación en C, los operadores caen en una de tres categorías:</p><p><strong>Operadores <a href="https://learn.microsoft.com/es-es/cpp/c-language/c-operators?view=msvc-170">Unarios</a></strong></p><p><strong>Operadores Binarios</strong></p><p><strong>Operadores <a href="https://www.freecodecamp.org/espanol/news/operador-ternario-en-c/">Ternarios</a></strong></p><p>Operadores unarios operan sobre un solo operando. Algunos de los operadores unarios en C son:</p><ul><li><strong>Operadores aritméticos</strong> como el operador de incremento (<code>++</code>), que incrementa el valor del operando en <code>1</code>. Y el operador de decremento (--), que decrementa el valor del operando en <code>1</code>.</li><li><strong>Operadores lógicos</strong> como el operador NOT(<code>!</code>). Este operador invierte el valor lógico del operando: cambia <code>true</code> a <code>false</code> y <code>false</code> a <code>true</code>.</li><li><strong>Operadores a nivel de bits (bitwise) </strong>como el operador NOT(<code>~</code>), que cambia cada bit <code>0</code> a <code>1</code> y cada bit <code>1</code> a <code>0</code>.</li></ul><p>Los operadores <strong>binarios </strong>operan sobre dos operandos. Algunos de los operadores binarios en C son:</p><ul><li>Operadores aritméticos (<code>+</code>, <code>-</code>, <code>*</code>, <code>/</code>, <code>%</code>): Estos operadores realizan cálculos matemáticos en datos numéricos como la adición, sustracción, multiplicación, división y encontrar el resto.</li><li>Operadores de igualdad/relacionales (<code>==</code>, <code>!=</code>, <code>&gt;</code>, <code>&lt;</code>, <code>&gt;=</code>, <code>&lt;=</code>): Estos operadores comparan dos valores y determinan si un operando es mayor que, menor que, igual a o no igual a otro operando.</li><li>Operadores lógicos/condicionales como los operadores AND (<code>&amp;&amp;</code>) y OR (<code>||</code>).</li><li>Operadores a nivel de bits (<code>&amp;</code>, <code>|</code>, <code>^</code>, <code>&lt;&lt;</code>, <code>&gt;&gt;</code>): Tratan los elementos de datos como una secuencia de bits (es decir, 0s y 1s).</li><li>Operadores de asignación (<code>=</code>, <code>+=</code>, <code>-=</code> <code>*=</code>, <code>/=</code>, <code>%=</code>): Asignan un valor específico a una variable.</li></ul><p><strong>El operador Ternario</strong> (<code>?:</code>) opera en tres operandos. La sintaxis general se parece a la siguiente:</p><pre><code class="language-c">(condición) ? expresión1 : expresión2;</code></pre><p>El operador ternario es un operador condicional que puedes usar como una abreviatura para <code>if..else</code>. Realiza comparaciones y genera un resultado.</p><h2 id="-cu-l-es-el-papel-de-los-operadores-l-gicos-en-la-programaci-n-en-c">¿Cuál es el papel de los Operadores Lógicos en la Programación en C?</h2><p>Los operadores lógicos se utilizan comúnmente en declaraciones condicionales (como las declaraciones <code>if..else</code>), ya que ayudan en la toma de decisiones: determinan qué acción debe tener lugar y qué código debe ejecutarse a continuación según las condiciones que establezcas.</p><p>Combina los operadores lógicos con una o múltiples condiciones para crear una expresión lógica.</p><p>Los operadores lógicos evalúan la expresión lógica y devuelven un resultado.</p><p>El resultado siempre es un valor booleano. Un valor booleano determina si la expresión es verdadera <code>true</code> o falsa <code>false</code>.</p><p>Hay tres operadores lógicos en la programación en C: el AND lógico (<code>&amp;&amp;</code>), el OR lógico (<code>||</code>) y el NOT lógico (<code>!</code>).</p><p>Vamos a entrar en más detalle sobre cada uno en las siguientes secciones.</p><h2 id="c-mo-usar-el-operador-l-gico-and-en-la-programaci-n-en-c">Cómo Usar el Operador Lógico AND <code>(&amp;&amp;)</code> en la Programación en C</h2><p>El operador lógico AND (<code>&amp;&amp;</code>) verifica si todos los operandos son verdaderos: el resultado es verdadero solo cuando todos los operandos son verdaderos.</p><p>Aquí está la tabla de verdad para el operador AND (<code>&amp;&amp;</code>) cuando estás trabajando con dos operandos:</p><!--kg-card-begin: html--><table><thead><tr><th>Primer Operando</th>
<th>Segundo Operando</th>
<th>Resultado</th>
</tr>
</thead>
<tbody>
<tr>
<td>true</td>
<td>true</td>
<td>true</td>
</tr>
<tr>
<td>true</td>
<td>false</td>
<td>false</td>
</tr>
<tr>
<td>false</td>
<td>true</td>
<td>false</td>
</tr>
<tr>
<td>false</td>
<td>false</td>
<td>false</td></tr></tbody></table><!--kg-card-end: html--><p>Algo importante a tener en cuenta aquí es que, cuando el primer operando es falso, el segundo operando no se evalúa.</p><p>Veamos un ejemplo: El resultado de <code>(10 == 10) &amp;&amp; (20 == 20)</code> es verdadero porque ambos operandos son verdaderos: <code>(10 == 10)</code> es verdadero y <code>(20 == 20)</code> es verdadero.</p><p>Veamos otro ejemplo: El resultado de <code>(10 == 20) &amp;&amp; (20 == 20)</code> es falso porque uno de los operandos es falso: en este caso, el primer operando es falso, por lo que el segundo operando no se evalúa.</p><p>Ahora, veamos cómo puedes usar el operador <code>&amp;&amp;</code> en una declaración <code>if</code>:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
  int a = 20;
  int b = 30;

  if (a &gt; 10 &amp;&amp; b &gt; 10)
    printf("Ambos números son mayores que 10\n");
}

// salida

// Ambos números son mayores que 10
</code></pre><p>En el ejemplo anterior, la salida es "Al menos uno de los números es mayor que 10" porque se cumple la condición <code>a &gt; 10 || b &gt; 10</code> – al menos uno de los operandos es verdadero.</p><p>La primera condición, <code>a &gt; 10</code>, es verdadera, por lo que el resultado es verdadero.</p><p>Si tanto <code>a</code> como <code>b</code> fueran falsos, no habría salida.</p><h2 id="c-mo-usar-el-operador-l-gico-to-use-the-or-logical-en-la-programaci-n-en-c">Cómo usar el operador lógico to Use the OR <code>(||)</code> Logical en la programación en C </h2><p>La operación lógica OR (<code>||</code>) verifica si al menos uno de los operandos es verdadero; el resultado es verdadero si al menos uno de los operandos es verdadero.</p><p>Aquí tienes la tabla de verdad para el operador OR (<code>||</code>) cuando estás trabajando con dos operandos:</p><!--kg-card-begin: html--><table><thead><tr><th>Primer Operando</th>
<th>Segundo Operando</th>
<th>Resultado</th>
</tr>
</thead>
<tbody>
<tr>
<td>true</td>
<td>true</td>
<td>true</td>
</tr>
<tr>
<td>true</td>
<td>false</td>
<td>true</td>
</tr>
<tr>
<td>false</td>
<td>true</td>
<td>true</td>
</tr>
<tr>
<td>false</td>
<td>false</td>
<td>false</td></tr></tbody></table><!--kg-card-end: html--><p>Ten en cuenta que con el operador OR (<code>||</code>), si el primer operando es verdadero, entonces el segundo operando no se evalúa.</p><p>Veamos un ejemplo: El resultado de <code>(10 == 20) || (20 == 20)</code> es verdadero porque al menos uno de los operandos es verdadero; en este caso, es el segundo operando, incluso si el primer operando es falso.</p><p>Veamos otro ejemplo: El resultado de <code>(20 == 20) || (10 == 20)</code> es verdadero porque uno de los operandos es verdadero; en este caso, dado que el primer operando es verdadero, el segundo no se evalúa.</p><p>Ahora, veamos cómo puedes usar el operador OR (<code>||</code>) en una declaración if:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
  int a = 20;
  int b = 5;

  if (a &gt; 10 || b &gt; 10)
    printf("Al menos uno de los números es mayor que 10");
}</code></pre><p>En el ejemplo anterior, la salida es "Al menos uno de los números es mayor que 10" porque se cumple la condición <code>a &gt; 10 || b &gt; 10</code> – al menos uno de los operandos es verdadero.</p><p>La primera condición, <code>a &gt; 10</code>, es verdadera, por lo que el resultado es verdadero.</p><p>Si tanto <code>a</code> como <code>b</code> fueran falsos, no habría salida.</p><h2 id="c-mo-usar-el-operador-l-gico-not-en-la-programaci-n-en-c">Cómo Usar el Operador Lógico NOT <code>(!)</code> en la Programación en C</h2><p>El operador lógico NOT (<code>!</code>) niega el operando – es decir, devuelve lo opuesto al operando.</p><p>Si el operando es <code>true</code>, devuelve <code>false</code>.</p><p>Y si es <code>false</code>, devuelve <code>true</code>.</p><p>Aquí está la tabla de verdad para el operador NOT (<code>!</code>):</p><!--kg-card-begin: html--><table><thead><tr><th>Operando</th>
<th>Resultado</th>
</tr>
</thead>
<tbody>
<tr>
<td>true</td>
<td>false</td>
</tr>
<tr>
<td>false</td>
<td>true</td></tr></tbody></table><!--kg-card-end: html--><p>Veamos un ejemplo: El resultado de <code>!(10 == 10)</code> es <code>false</code>.</p><p>La condición <code>10 == 10</code> es verdadera, pero el operador <code>!</code> la niega.</p><p>Y veamos otro ejemplo: El resultado de <code>!(10 == 20)</code> es <code>true</code>.</p><p>La condición <code>10 == 20</code> es falsa, pero el operador <code>!</code> la niega.</p><p>Ahora, revisa el siguiente ejemplo para ver cómo puedes usar el operador NOT (<code>!</code>) en una declaración <code>if</code>:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
  int a = 20;
  int b = 5;

  if (a &gt; 10 || b &gt; 10)
    printf("Al menos uno de los números es mayor que 10");
}
</code></pre><p>El resultado es <code>a es mayor que b</code> porque la condición <code>a &gt; b</code> es verdadera.</p><p>Sin embargo, si usaste el operador NOT (<code>!</code>), la condición ya no es verdadera, por lo que no habría salida:</p><pre><code class="language-c">
#include &lt;stdio.h&gt;

int main(void) {
  int a = 20;
  int b = 5;

  if ( a &gt; b)
    printf("a es mayor que b\n");
</code></pre><h2 id="conclusi-n">Conclusión</h2><p>¡Y ahí lo tienes! Ahora sabes cómo funcionan los tres operadores lógicos en la programación en C.</p><p>Para aprender más sobre C, te recomiendo leer <a href="https://www.freecodecamp.org/news/the-c-beginners-handbook/">este manual para principiantes en C </a>para familiarizarte con los conceptos básicos del lenguaje.</p><p>¡Gracias por leer, y feliz codificación!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Sentencia If...Else en C explicada ]]>
                </title>
                <description>
                    <![CDATA[ El flujo de código condicional es la capacidad de cambiar la forma en la que se comporta un fragmento de código en función en ciertas condiciones. En tales situaciones puedes usar las sentencias if. La sentencia if también se conoce como una sentencia de toma de decisiones, ya que toma ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/sentencia-if-else-en-c-explicada/</link>
                <guid isPermaLink="false">6319f7bdb1786008d5614741</guid>
                
                    <category>
                        <![CDATA[ programacion c ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sil Zubikarai ]]>
                </dc:creator>
                <pubDate>Wed, 30 Nov 2022 03:58:28 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/09/5f9c9da9740569d1a4ca38ef.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/if-statements-in-c/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">If...Else Statement in C Explained</a>
      </p><p>El flujo de código condicional es la capacidad de cambiar la forma en la que se comporta un fragmento de código en función en ciertas condiciones. En tales situaciones puedes usar las sentencias <code>if</code>.</p><p>La sentencia <code>if</code> también se conoce como una sentencia de toma de decisiones, ya que toma una decisión sobre la base de una condición o expresión dada. El bloque de código dentro de la instrucción <code>if</code> que se ejecuta es la condición evaluada como true. Sin embargo, el código dentro de las llaves se omite si la condición es evalúa como false, y el código después de la sentencia <code>if</code> es ejecutada.</p><h3 id="sintaxis-de-sentencia-if"><strong>Sintaxis de sentencia <strong><code>if</code></strong></strong></h3><pre><code class="language-text">if (testCondition) {
   // statements
}</code></pre><h3 id="un-ejemplo-sencillo"><strong>Un ejemplo sencillo</strong></h3><p>Vamos a ver un ejemplo de esto en acción:</p><pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdbool.h&gt;

int main(void) {
    if(true) {
        printf("Statement is True!\n");
    }

    return 0;
}</code></pre><p><strong> Salida:</strong></p><pre><code class="language-text">Statement is True!</code></pre><p>Si el código entre el paréntesis de la sentencia <code>if</code> es true, todo dentro de las llaves es ejecutado. En este caso, <code>true</code> evalúa a true, entonces el código ejecuta la función <code>printf</code>.</p><h3 id="sentencias-if-else"><strong> </strong>Sentencias<strong> <strong><code>if..else</code> </strong></strong></h3><p>En una sentencia <code>if...else</code>, si el código en el paréntesis de la sentencia <code>if</code> &nbsp;es true, el código dentro de las llaves es ejecutado. Pero si la sentencia dentro del paréntesis es falso, todo el código dentro de las llaves de la sentencia <code>else</code> es ejecutada en su lugar.</p><p>Claro, en el ejemplo anterior no fue muy útil en este caso porque <code>true</code> siempre evalúa a verdadero. Aquí hay otro que es un poco más práctico:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
    int n = 2;

    if(n == 3) { // comparing n with 3
        printf("Statement is True!\n");
    } 
    else { // if the first condition is not true, come to this block of code
        printf("Statement is False!\n");
    }

    return 0;
}</code></pre><p><strong>Salida:</strong></p><pre><code class="language-text">Statement is False!</code></pre><p>Hay algunas diferencias importantes aquí. En primer lugar, <code>stdbool.h</code> no se ha sido incluido. Eso está bien porque <code>true</code> &nbsp;y &nbsp;<code>false</code> no se usan como en el primer ejemplo. En C, como en otros lenguajes de programación, puede usar sentencias que evalúan como verdadero o falso en lugar de usar los valores booleanos <code>true</code> o <code>false</code> directamente.</p><p>Observe también la condición en el paréntesis de la sentencia <code>if</code>: <code>n == 3</code>. Esta condición compara <code>n</code> y el número 3. <code>==</code> es el operador comparación, &nbsp;y es una de varias operaciones de comparación C.</p><h3 id="if-else-anidado"><strong><strong> <code>if...else</code></strong> anidado</strong></h3><p>La sentencia <code>if...else</code> permite elegir entre dos posibilidades. Pero algunas veces necesita elegir entre tres o más posibilidades.</p><p>Por ejemplo, el signo función en matemáticas devuelve -1 si es argumento es menor que cero, +1 si el argumento es mayor que cero, y devuelve cero si el argumento es cero.</p><p>El siguiente código implementa esta función:</p><pre><code class="language-c">if (x &lt; 0)
   sign = -1;
else
   if (x == 0)
      sign = 0;
   else
      sign = 1;</code></pre><p>Como puede ver, una segunda sentencia <code>if...else</code> es anidada dentro de la sentencia de la primera sentencia <code>if..else</code>.</p><p>Si <code>x</code> &nbsp;es menor que 0, entonces <code>sign</code> se establece en -1. Sin embargo, si <code>x</code> no es menor que 0, la segunda sentencia <code>if...else</code> es ejecutada. Allí, si <code>x</code> es igual a 0, <code>sign</code> también se establece en 0. Pero si <code>x</code> es mayor que 0, <code>sign</code> en lugar de ser establece en 1.</p><p>En lugar en una sentencia <code>if...else</code> anidada, los principiantes a menudo usan una cadena de sentencias <code>if</code>:</p><pre><code class="language-c">if (x &lt; 0) {
   sign = -1;
}
   
if (x == 0) {
   sign = 0;
}
   
if (x &gt; 0) {
   sign = 1;
}</code></pre><p>Si bien esto funciona, no se recomienda, ya que no está claro que solo una de las instrucciones de asignación (<code>sign = ...</code>) está destinada al ejecutarse dependiendo del valor de <code>x</code>. También es ineficiente: cada vez que se ejecuta el código, se prueban la tras condiciones, incluso si una o dos no tienen que serlo.</p><h3 id="sentencia-else-if">Sentencia<strong> <strong>else...if </strong></strong></h3><p>Sentencias <code>if...else</code> son una alternativa a una cadena de sentencias <code>if</code>. Considere lo siguiente:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
    int n = 5;

    if(n == 5) {
        printf("n is equal to 5!\n");
    } 
    else if (n &gt; 5) {
        printf("n is greater than 5!\n");
    }

    return 0;
}</code></pre><p><strong>Salida<strong>:</strong></strong></p><pre><code class="language-text">n is equal to 5!</code></pre><p>Si la condición de la sentencia <code>if</code> se evalúa a false, la condición para la sentencia <code>else...if</code> es revisada. Si la condición evalúa a true, el código dentro de las llaves de la sentencia <code>else...if</code> se ejecuta.</p><h3 id="operadores-de-comparaci-n"><strong>Operadores de comparación</strong></h3><!--kg-card-begin: html--><table style="box-sizing: inherit; margin: 0.5em 0px 2.5em; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll;"><thead style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--gray10);">OPERATOR NAME</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--gray10);">USAGE</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--gray10);">RESULT</th></tr></thead><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Equal To</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">a == b</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">True if<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">a</code><span>&nbsp;</span>is equal to<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">b</code>, false otherwise</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Not Equal To</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">a != b</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">True if<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">a</code><span>&nbsp;</span>is not equal to<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">b</code>, false otherwise</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Greater Than</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">a &gt; b</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">True if<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">a</code><span>&nbsp;</span>is greater than<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">b</code>, false otherwise</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Greater Than or Equal To</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">a &gt;= b</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">True if<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">a</code><span>&nbsp;</span>is greater than or equal to<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">b</code>, false otherwise</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Less Than</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">a &lt; b</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">True if<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">a</code><span>&nbsp;</span>is less than<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">b</code>, false otherwise</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Less Than or Equal To</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">a &lt;= b</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">True if<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">a</code><span>&nbsp;</span>is less than or equal to<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">b</code>, false otherwise</td></tr></tbody></table><!--kg-card-end: html--><h2 id="operadores-l-gicos"><strong>Operadores Lógicos</strong></h2><p>Es posible que deseemos ejecutar un poco de código si algo no es cierto, o si dos cosas son verdaderas. Para eso tenemos operadores lógicos:</p><!--kg-card-begin: html--><table style="box-sizing: inherit; margin: 0.5em 0px 2.5em; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll;"><thead style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--gray10);">OPERATOR NAME</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--gray10);">USAGE</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--gray10);">RESULT</th></tr></thead><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Not (<code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">!</code>)</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">!(a == 3)</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">True if<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">a</code><span>&nbsp;</span>is<span>&nbsp;</span><strong style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">not</strong><span>&nbsp;</span>equal to 3</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">And (<code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">&amp;&amp;</code>)</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">a == 3 &amp;&amp; b == 6</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">True if<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">a</code><span>&nbsp;</span>is equal to 3<span>&nbsp;</span><strong style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">and</strong><span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">b</code><span>&nbsp;</span>is equal to 6</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Or (<code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">||</code>)</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">a == 2 || b == 4</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">True if<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">a</code><span>&nbsp;</span>is equal to 2<span>&nbsp;</span><strong style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">or</strong><span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">b</code><span>&nbsp;</span>is equal to 4</td></tr></tbody></table><!--kg-card-end: html--><p>Por ejemplo:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
    int n = 5;
    int m = 10;

    if(n &gt; m || n == 15) {
        printf("Either n is greater than m, or n is equal to 15\n");
    } 
    else if( n == 5 &amp;&amp; m == 10 ) {
        printf("n is equal to 5 and m is equal to 10!\n");
    } 
    else if ( !(n == 6)) {
        printf("It is not true that n is equal to 6!\n");
    }
    else if (n &gt; 5) {
        printf("n is greater than 5!\n");
    }

    return 0;
}</code></pre><p><strong>Salida<strong>:</strong></strong></p><pre><code class="language-text">n is equal to 5 and m is equal to 10!</code></pre><h3 id="una-nota-importante-sobre-las-comparaciones-c"><strong>Una nota importante sobre las comparaciones C </strong></h3><p>Como lo mencionamos con anterioridad que cada comparación verifica si algo es verdadero o falso, pero eso solo es una verdad a medias. C es muy ligero y cercano al hardware en el que se está ejecutando. Con el hardware es fácil comprobar si algo es 0 o falso, pero cualquier otra cosa es mucho más difícil.</p><p>En cambio, mucho más preciso decir que las comparaciones realmente están comprobando si algo es 0/ falso, o si es cualquier otro valor.</p><p>Por ejemplo, esta sentencia if es verdadera y válida:</p><pre><code class="language-c">if(12452) {
    printf("This is true!\n")
}</code></pre><p>Por diseño, 0 es falso, y por convención, 1 es verdadero. De hecho, aquí hay un vistazo a la biblioteca <code>stdbool.h</code>:</p><pre><code class="language-c">#define false   0
#define true    1</code></pre><p>Si bien hay un poco más, este es el núcleo de cómo funcionan los booleanos y cómo funciona la biblioteca. Estas dos líneas indican al compilador que reemplace la palabra false con 0 y true con 1.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
