{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/sintaxis-basica-cpp-parte-1","result":{"data":{"markdownRemark":{"id":"2666485b-232a-530f-8132-9bcfd390a00d","html":"<p>Hola, con este artículo doy inicio a una serie de <em>posts</em> explicando la sintaxis básica y expresiones usadas en las versiones modernas de C++ (C++11 en adelante). Hay mucho material dando vueltas por internet que explica lo mismo que quiero hacer, pero que suele estar enfocado en versiones anteriores de la norma y, hoy por hoy, están bastante desactualizados, considerando que en los últimos 10 años se han añadido bastantes características que han mejorado el uso del lenguaje considerablemente y lo han vuelto una herramienta aún más poderosa si se usa de forma apropiada.</p>\n<p>En este primer artículo explicaré lo básico sobre estructuras de control, variables, tipos de variables y bibliotecas y la estructura de un programa sencillo. No explicaré todo desde cero porque asumo que quien lea esto entenderá lo básico sobre programación. No es necesariamente cosas que fueron añadidas en versiones recientes del lenguaje, pero esto nos permitirá sentar una base para lo que venga a futuro.</p>\n<h2 id=\"variables\" style=\"position:relative;\"><a href=\"#variables\" aria-label=\"variables permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Variables</h2>\n<p>Una variable se podría definir como un contenedor o recipiente que alberga algún tipo de dato en memoria, como puede ser un entero, una cadena de caracteres, un arreglo de números decimales, entre muchos otros.</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token comment\">// Una variable se define de la forma</span>\n<span class=\"token comment\">// &lt;tipo> &lt;nombre> [= &lt;valor inicial>];</span>\n\n<span class=\"token comment\">// Un número entero entre -2^31 y (2^31)-1</span>\n<span class=\"token comment\">// en arquitecturas de PC modernas</span>\n<span class=\"token keyword\">int</span> nice <span class=\"token operator\">=</span> <span class=\"token number\">69</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Un número sin signo entre 0 y (2^32)-1</span>\n<span class=\"token keyword\">unsigned</span> poblacion <span class=\"token operator\">=</span> <span class=\"token number\">18730000</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Un número entre -128 y 127 (usualmente</span>\n<span class=\"token comment\">// utilizado para caracteres ASCII básicos)</span>\n<span class=\"token keyword\">char</span> a_mayus <span class=\"token operator\">=</span> <span class=\"token string\">'A'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Un número flotante de precisión simple (~7 decimales)</span>\n<span class=\"token keyword\">float</span> un_medio <span class=\"token operator\">=</span> <span class=\"token number\">0.5</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Flotante de precisión doble (~15 decimales)</span>\n<span class=\"token keyword\">double</span> pi <span class=\"token operator\">=</span> <span class=\"token number\">3.141592653589793</span>\n\n<span class=\"token comment\">// Un valor booleano (verdadero/falso)</span>\n<span class=\"token keyword\">bool</span> es_verdad <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Una cadena de caracteres terminada en 0 y</span>\n<span class=\"token comment\">// de tamaño fijo (el 0 es implícito; lo</span>\n<span class=\"token comment\">// añade el ompilador)</span>\n<span class=\"token keyword\">char</span> saludo<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"Hola\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Una versión mejorada del ejemplo anterior</span>\n<span class=\"token comment\">// (permite un manejo de texto más simple y es</span>\n<span class=\"token comment\">// de tamaño variable)</span>\nstd<span class=\"token double-colon punctuation\">::</span>string despedida <span class=\"token operator\">=</span> <span class=\"token string\">\"Hola\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Si no se asigna un valor al definir la variable, su</span>\n<span class=\"token comment\">// contenido quedará indeterminado (podría tomar</span>\n<span class=\"token comment\">// cualquier valor presente en memoria al momento de</span>\n<span class=\"token comment\">// ejecutarse el programa)</span>\n\n<span class=\"token comment\">// Sin embargo, esto no es necesariamente malo. Solo hay que</span>\n<span class=\"token comment\">// tener cuidado y asignarle un valor antes de usarla</span>\n<span class=\"token keyword\">int</span> indet<span class=\"token punctuation\">;</span>\n\nindet <span class=\"token operator\">=</span> <span class=\"token number\">420</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Aquí le asignamos un valor. Nice</span></code></pre></div>\n<p>Una variable puede definirse como constante (<code class=\"language-text\">const</code>) si no se piensa modificar una vez creada:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">const</span> <span class=\"token keyword\">double</span> phi <span class=\"token operator\">=</span> <span class=\"token number\">1.618</span><span class=\"token punctuation\">;</span>\n\nphi <span class=\"token operator\">=</span> <span class=\"token number\">2.0</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// INVÁLIDO</span></code></pre></div>\n<h2 id=\"sintaxis-básica-de-un-programa\" style=\"position:relative;\"><a href=\"#sintaxis-b%C3%A1sica-de-un-programa\" aria-label=\"sintaxis básica de un programa permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Sintaxis básica de un programa</h2>\n<p>Para crear un programa en C++, necesitamos crear un archivo fuente que contenga el código que queremos ejecutar. Para esto existen un sinnúmero de editores o entornos de desarrollo que pueden usar (Visual Studio, Visual Studio Code, Emacs, Vim, Atom, Sublime Text, etc.). Lo importante aquí es tener acceso a un compilador que convierta el código fuente en código máquina que el computador pueda entender. En este ejemplo voy a usar <code class=\"language-text\">g++</code>, parte de la <em>suite</em> GCC y que se encuentra disponible en toda distribución GNU/Linux (e inclusive en Windows, gracias a proyectos como MinGW, por dar un ejemplo).</p>\n<p>La estructura de un programa C++ básico es como la siguiente:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token comment\">// Bibliotecas a incluir</span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;iostream></span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;vector></span></span>\n\n<span class=\"token keyword\">void</span> <span class=\"token function\">saludar</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Hola\\n\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Esta no es la forma óptima de recibir un argumento,</span>\n<span class=\"token comment\">// pero veremos cómo mejorarlo más adelante.</span>\n<span class=\"token keyword\">int</span> <span class=\"token function\">suma</span><span class=\"token punctuation\">(</span>std<span class=\"token double-colon punctuation\">::</span>vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">int</span><span class=\"token operator\">></span> vec<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>vec<span class=\"token punctuation\">.</span><span class=\"token function\">empty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">int</span> acc <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> <span class=\"token keyword\">int</span> n <span class=\"token operator\">:</span> vec<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        acc <span class=\"token operator\">+=</span> n<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> acc<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">saludar</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    std<span class=\"token double-colon punctuation\">::</span>vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">int</span><span class=\"token operator\">></span> nums<span class=\"token punctuation\">{</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">6</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token function\">suma</span><span class=\"token punctuation\">(</span>nums<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Los tres bloques entre llaves que ven se denominan <em>funciones</em>. Estas son trozos de código que encapsulan alguna funcionalidad y permiten separar instrucciones que cumplan propósitos diferentes. La última de estas es la más importante, pues el compilador espera que en el código que le proveamos exista como mínimo una función llamada <code class=\"language-text\">main</code>. Esta cumple el rol de ser el punto de entrada desde el cual el sistema operativo empezará a ejecutar código.</p>\n<p>Una función puede recibir valores como entrada (sobre los que puede trabajar) y entregar como salida otro valor. Tanto entradas como salidas son opcionales e implementarlas o no dependerá de las circunstancias en las que estén trabajando.</p>\n<p>En el caso de la importante función <code class=\"language-text\">main</code> o la función <code class=\"language-text\">saludar</code>, podemos notar que no aceptan argumentos, esto porque los paréntesis que vemos después del nombre están vacíos (<code class=\"language-text\">()</code>). En cambio, la función <code class=\"language-text\">suma</code> acepta un vector de enteros de nombre <code class=\"language-text\">vec</code> (<code class=\"language-text\">std::vector&lt;int> vec</code>). Con respecto a las salidas, tanto la función <code class=\"language-text\">main</code> como <code class=\"language-text\">suma</code> devuelven un entero. En el caso de <code class=\"language-text\">suma</code>, la suma de los números del vector que le entregamos. En el caso de <code class=\"language-text\">main</code>, este número lo recibe el SO e indica si la ejecución fue exitosa (retorna 0) o no (cualquier número distinto de 0).</p>\n<p>Ahora, para convertir este código en un ejecutable, lo guardamos en un archivo (en este caso lo podemos llamar <code class=\"language-text\">funciones.cpp</code>) y ejecutaremos el siguiente comando en una terminal:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">g++ -o funciones funciones.cpp</code></pre></div>\n<p>Lo que hacemos aquí es invocar al compilador <code class=\"language-text\">g++</code> para que lea el archivo <code class=\"language-text\">funciones.cpp</code>, lo procese y lo convierta en el ejecutable <code class=\"language-text\">funciones</code> (<code class=\"language-text\">funciones.exe</code> si se compila en Windows; el <code class=\"language-text\">.exe</code> se debería añadir implícitamente).</p>\n<p>Este proceso es relativamente simple si solo queremos compilar un programa a partir de uno o dos archivos fuente. El problema viene cuando nuestro programa depende de varios archivos y no queremos llamar a <code class=\"language-text\">g++</code> decenas de veces o escribir un comando que tome tres líneas de la pantalla. Para problemas como este existen soluciones como <code class=\"language-text\">make</code> o CMake, las que podemos ver más adelante. Para proyectos simples, basta con una llamada a <code class=\"language-text\">g++</code> siguiendo la siguiente sintaxis:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">g++ <span class=\"token punctuation\">[</span>-o <span class=\"token operator\">&lt;</span>nombre_ejecutable<span class=\"token operator\">></span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;</span>archivo_<span class=\"token operator\"><span class=\"token file-descriptor important\">1</span>></span>.cpp <span class=\"token punctuation\">\\</span>\n<span class=\"token operator\">&lt;</span>archivo_<span class=\"token operator\"><span class=\"token file-descriptor important\">2</span>></span>.cpp <span class=\"token punctuation\">..</span>. <span class=\"token operator\">&lt;</span>archivo_n<span class=\"token operator\">></span>.cpp</code></pre></div>\n<p>Si no especifican un nombre para el ejecutable con <code class=\"language-text\">-o</code>, el compilador lo llamará <code class=\"language-text\">a.out</code> (nota histórica: este nombre se remonta a cuando Linux aún no existía y x86 no era la arquitectura principal para sistemas UNIX).</p>\n<h2 id=\"bibliotecas\" style=\"position:relative;\"><a href=\"#bibliotecas\" aria-label=\"bibliotecas permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Bibliotecas</h2>\n<p>Además de las características propias del lenguaje (algunas de las cuales veremos después de esta sección), la librería estándar ofrece varias bibliotecas (que no son más que código ya escrito que implementa funcionalidades usadas a menudo por programadores) que nos permiten, por ejemplo, trabajar con entrada y salida de la terminal, lectura y escritura de archivos, el uso de contenedores para almacenar datos (como los vectores que ya he mencionado) y algoritmos de manipulación de datos, ordenamiento, entre muchos otros.</p>\n<p>La biblioteca más importante para comenzar en mi opinión es <code class=\"language-text\">&lt;iostream></code>, que nos permite imprimir texto en pantalla y leerlo desde el teclado del usuario, esto por medio de los <em>streams</em> <code class=\"language-text\">std::cin</code> (la entrada estándar, usualmente el teclado), <code class=\"language-text\">std::cout</code> (la salida estándar, por lo general la pantalla) y <code class=\"language-text\">std::cerr</code> (el error estándar, que igual suele ser la pantalla, pero para mantener los errores separados de la salida normal). Se les denomina <em>stream</em> porque internamente podemos imaginar estos tres conductos como corrientes (<em>streams</em>) por las que fluye la información de manera constante, donde terminan llegando a un búfer que los va acumulando y permiten que el programa pueda captar datos que no necesariamente llegan a una tasa constante.</p>\n<p>Más adelante veremos estructuras y objetos como <code class=\"language-text\">std::vector</code>, <code class=\"language-text\">std::list</code> o <code class=\"language-text\">std::fstream</code>, que nos otorgan más posiblidades para resolver problemas con nuestro código.</p>\n<h3 id=\"iostream-entrada-y-salida-de-terminal\" style=\"position:relative;\"><a href=\"#iostream-entrada-y-salida-de-terminal\" aria-label=\"iostream entrada y salida de terminal permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><code class=\"language-text\">&lt;iostream></code>: Entrada y salida de terminal</h3>\n<p>Si desean imprimir texto en pantalla, pueden hacer uso de <code class=\"language-text\">std::cout</code>, el cual recibirá cualquier texto, número o variable que le entreguen y lo imprimirá en la salida estándar o <code class=\"language-text\">stdout</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;iostream></span> <span class=\"token comment\">// Así se incluye una biblioteca.</span></span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// El operador &lt;&lt; indica que queremos \"insertar\"</span>\n    <span class=\"token comment\">// el texto \"Hola\\n\" en el stream de salida</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Hola\\n\"</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Si necesitan retornar un error, es buena práctica mantenerlo separado de <code class=\"language-text\">stdout</code> y dirigirlo en cambio a <code class=\"language-text\">stderr</code> (el error estándar) usando <code class=\"language-text\">std::cerr</code></p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;iostream></span></span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">hacer_algo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Este es un prototipo. Indica que existe</span>\n                  <span class=\"token comment\">// una función pero cuyo código aún no está</span>\n                  <span class=\"token comment\">// definido (en este caso podría estar al</span>\n                  <span class=\"token comment\">// fondo del archivo)</span>\n\n                  <span class=\"token comment\">// Tanto C como C++ esperan que una función</span>\n                  <span class=\"token comment\">// esté definida antes de llamarla. Una</span>\n                  <span class=\"token comment\">// forma de sortear esto es poniendo el</span>\n                  <span class=\"token comment\">// prototipo al inicio y definir la</span>\n                  <span class=\"token comment\">// función después</span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">hacer_algo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// Si la función retorna 0, imprimimos a stdout</span>\n        std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Éxito\\n\"</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// De no ser así, indicamos el error en stderr</span>\n        std<span class=\"token double-colon punctuation\">::</span>cerr <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Chale\\n\"</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Aquí definimos la función ya declarada anteriormente</span>\n<span class=\"token keyword\">int</span> <span class=\"token function\">hacer_algo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Como pueden ver, para imprimir en una nueva línea, podemos escapar el carácter ASCII para nueva línea (también conocido como LF) usando el ya tradicional <code class=\"language-text\">\\n</code>. Sin embargo, otra forma de hacer esto es insertando en el <em>stream</em> de salida (ya sea <code class=\"language-text\">std::cerr</code> o <code class=\"language-text\">std::cout</code>) el manipulador <code class=\"language-text\">std::endl</code>, que además de insertar el carácter <code class=\"language-text\">\\n</code> fuerza la descarga el búfer de salida en pantalla (el texto que uno pone en <code class=\"language-text\">stdout</code> o <code class=\"language-text\">stderr</code> puede no ser impreso inmediatamente, pues depende de la implentación del sistema).</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\">std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Estas dos líneas\"</span> <span class=\"token operator\">&lt;&lt;</span> std<span class=\"token double-colon punctuation\">::</span>endl<span class=\"token punctuation\">;</span>\nstd<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"van a estar en líneas separadas.\\n\"</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Finalmente, si queremos leer información de parte del usuario (como un número o un texto), usaremos <code class=\"language-text\">std::cin</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;iostream></span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;string></span> <span class=\"token comment\">// Para trabajar con el tipo std::string</span></span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Cuál es tu nombre?\\n\"</span><span class=\"token punctuation\">;</span>\n\n    std<span class=\"token double-colon punctuation\">::</span>string nombre<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// En este caso, el operador >> indica</span>\n    <span class=\"token comment\">// que queremos extraer un string desde</span>\n    <span class=\"token comment\">// stdin (la entrada estándar) y guar-</span>\n    <span class=\"token comment\">// darlo en una variable</span>\n    std<span class=\"token double-colon punctuation\">::</span>cin <span class=\"token operator\">>></span> nombre<span class=\"token punctuation\">;</span>\n\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Hola, \"</span> <span class=\"token operator\">&lt;&lt;</span> nombre <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"!\\n\"</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>También es posible utilizar las funciones propias de la librería estándar de C (como <code class=\"language-text\">printf</code>, <code class=\"language-text\">scanf</code> y sus derviados). En este caso, en vez de incluir la biblioteca <code class=\"language-text\">&lt;stdio.h></code> usaremos <code class=\"language-text\">&lt;cstdio></code>, pues así se denomina el archivo de cabecera según la norma de C++. Técnicamente es posible usar <code class=\"language-text\">&lt;stdio.h></code> en archivos C++, pero esto no está contemplado en la norma y no es una característica garantizada en todos los compiladores. Todas las bibliotcas que vienen de la libería estándar de C existen en C++ usando la misma nomenclatura (eliminando el <code class=\"language-text\">.h</code> al final y anteponiendo una <code class=\"language-text\">c</code>).</p>\n<h2 id=\"estructuras-de-control\" style=\"position:relative;\"><a href=\"#estructuras-de-control\" aria-label=\"estructuras de control permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Estructuras de control</h2>\n<h3 id=\"condicionales-simples-if\" style=\"position:relative;\"><a href=\"#condicionales-simples-if\" aria-label=\"condicionales simples if permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Condicionales simples (<code class=\"language-text\">if</code>)</h3>\n<p>Los bloques <code class=\"language-text\">if</code> son el tipo de estructura más simple. El programa verifica si una condición es verdadera o falsa y, dependiendo del resultado, ejecuta código:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token number\">2</span> <span class=\"token operator\">+</span> <span class=\"token number\">2</span> <span class=\"token operator\">==</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// El programa ejecutará el código entre las llaves</span>\n    <span class=\"token comment\">// si 2 + 2 es igual a 4</span>\n\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"El universo está funcionando bien.\\n\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Es posible ejecutar otro bloque de código en caso de que la condición no sea cierta o inclusive comprobar más de una condición en caso de que la primera no sea verdadera:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token number\">2</span> <span class=\"token operator\">-</span> <span class=\"token number\">2</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Nada que ver por aquí.\\n\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    std<span class=\"token double-colon punctuation\">::</span>cerr <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Houston, tenemos un problema!\\n\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">int</span> numero <span class=\"token operator\">=</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>numero <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Si el número es mayor a 0,</span>\n    <span class=\"token comment\">// salta a la siguiente condición</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Negativo\\n\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>numero <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Ídem</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Cero\\n\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Si esta condición tampoco</span>\n    <span class=\"token comment\">// es verdadera, el programa no hará nada</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Positivo\\n\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"condicionales-de-selección-switch\" style=\"position:relative;\"><a href=\"#condicionales-de-selecci%C3%B3n-switch\" aria-label=\"condicionales de selección switch permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Condicionales de selección (<code class=\"language-text\">switch</code>)</h3>\n<p>Si tenemos que una variable pueda tener uno de varios valores, podemos comprobar cuál de estos es usando una secuencia de <code class=\"language-text\">if</code>-<code class=\"language-text\">else if</code> como en la sección anterior. Sin embargo, puede volver el código poco legible si se trata de operaciones sencillas. Para casos así, podemos usar la estructura <code class=\"language-text\">switch</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">char</span> letra <span class=\"token operator\">=</span> <span class=\"token string\">'a'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">switch</span> <span class=\"token punctuation\">(</span>letra<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n<span class=\"token keyword\">case</span> <span class=\"token string\">'y'</span><span class=\"token operator\">:</span>\n    <span class=\"token comment\">// Si la letra fuera 'y', ejecutaría este código y</span>\n    <span class=\"token comment\">// saldría del switch</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">'Semivocal\\n'</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Si se omite la expresión break, el programa</span>\n    <span class=\"token comment\">// irá revisando los otros casos hasta</span>\n    <span class=\"token comment\">// encontrar otro break o salir del switch</span>\n    <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">case</span> <span class=\"token string\">'a'</span><span class=\"token operator\">:</span>\n<span class=\"token keyword\">case</span> <span class=\"token string\">'e'</span><span class=\"token operator\">:</span>\n<span class=\"token keyword\">case</span> <span class=\"token string\">'i'</span><span class=\"token operator\">:</span>\n<span class=\"token keyword\">case</span> <span class=\"token string\">'o'</span><span class=\"token operator\">:</span>\n<span class=\"token keyword\">case</span> <span class=\"token string\">'u'</span><span class=\"token operator\">:</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">'Vocal\\n'</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">default</span><span class=\"token operator\">:</span>\n    <span class=\"token comment\">// Este código se ejecuta sólo si ninguno de los</span>\n    <span class=\"token comment\">// valores anteriores coincide</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">'Consonante\\n'</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"bucles\" style=\"position:relative;\"><a href=\"#bucles\" aria-label=\"bucles permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Bucles</h3>\n<h4 id=\"while-y-do-while-controlado-por-condición\" style=\"position:relative;\"><a href=\"#while-y-do-while-controlado-por-condici%C3%B3n\" aria-label=\"while y do while controlado por condición permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><code class=\"language-text\">while</code> y <code class=\"language-text\">do while</code> (controlado por condición)</h4>\n<p>Los bucles <code class=\"language-text\">while</code> son los más simples en teoría. El código que envuelven es ejecutado si y sólo si la condición se mantiene verdadera. De serlo, se reejecuta. En caso contrario, se sale del bucle y se continúa con la ejecución del programa.</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">int</span> n <span class=\"token operator\">=</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>n <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// El programa imprimirá \"Hola!\" en pantalla</span>\n    <span class=\"token comment\">// mientras n tenga un valor positivo</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Hola!\\n\"</span><span class=\"token punctuation\">;</span>\n\n    n<span class=\"token operator\">--</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Es posible, si así se desea, crear un bucle infinito, el cual ejecutará el código que envuelve infinitamente hasta que el programa se interrumpa o el equipo que lo ejecuta se apague:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"El santuario de santa Teresita\"</span><span class=\"token punctuation\">;</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\" aún necesita tu aporte\\n\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Lo importante a considerar es que el chequeo de la condición se realiza antes de ejecutar el código del bucle, cosa contraria a lo que hace el bucle <code class=\"language-text\">do while</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">int</span> n <span class=\"token operator\">=</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">do</span> <span class=\"token punctuation\">{</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"farts\\n\"</span><span class=\"token punctuation\">;</span>\n\n    n<span class=\"token operator\">--</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// En este caso la verificación se hace al final</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>n <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h4 id=\"for-controlado-por-conteo\" style=\"position:relative;\"><a href=\"#for-controlado-por-conteo\" aria-label=\"for controlado por conteo permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><code class=\"language-text\">for</code> (controlado por conteo)</h4>\n<p>Cuando queremos ejecutar código una cierta cantidad fija de veces, podemos hacer uso de los bucles <code class=\"language-text\">for</code>, los cuales hacen uso de un contador que es chequeado en cada “vuelta” del ciclo e indica si debe seguirse ejecutando el bucle.</p>\n<p>El bucle <code class=\"language-text\">for</code> es ligeramente más complicado que <code class=\"language-text\">while</code>, pues involucra la inicialización del contador, la condición que mantendrá el bucle activo y una instrucción que se ejecuta al final de cada iteración.</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token comment\">// Este bucle parte con el entero i igualado a 0.</span>\n<span class=\"token comment\">// Se ejecutará siempre y cuando i sea menor que 10.</span>\n<span class=\"token comment\">// Al final de cada vuelta, i será incrementado en 1</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>i<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> i <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Este bucle va a imprimir el valor de i 10 veces.</span></code></pre></div>\n<p>Si desean que la variable del contador sea inicializada antes, se puede omitir de la declaración:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">int</span> i <span class=\"token operator\">=</span> <span class=\"token number\">42</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// ...</span>\n\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">*=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">funcion_rara</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Lo mismo puede hacerse con la instrucción que se ejecuta al final de cada paso (el único elemento obligatorio es la condición del bucle):</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i <span class=\"token operator\">=</span> <span class=\"token number\">100000</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n\n    i <span class=\"token operator\">=</span> <span class=\"token function\">calcular_i</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Una forma especial de <code class=\"language-text\">for</code> es una no se inicializa un contador, ni condición ni instrucción de término de iteración, volviendo al código envuelto en un bucle infinito:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"a\\n\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h4 id=\"for-basado-en-rangos-controlado-por-colección\" style=\"position:relative;\"><a href=\"#for-basado-en-rangos-controlado-por-colecci%C3%B3n\" aria-label=\"for basado en rangos controlado por colección permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><code class=\"language-text\">for</code> basado en rangos (controlado por colección)</h4>\n<p>Esta es una mis características favoritas del lenguaje y que fue implementada en C++11.</p>\n<p>Como veremos más adelante, la librería estándar de C++ nos ofrece una gran cantidad de estructuras que nos permiten almacenar información de diversas formas, siendo una de ellas <code class=\"language-text\">std::vector</code>, la cual nos permite crear un arreglo expandible:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token comment\">// Arreglo tradicional de tamaño fijo</span>\n<span class=\"token keyword\">int</span> arr<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Esto no va a funcionar aunque quisiéramos</span>\narr<span class=\"token punctuation\">[</span><span class=\"token number\">5</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">6</span><span class=\"token punctuation\">;</span>\n\nstd<span class=\"token double-colon punctuation\">::</span>vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">int</span><span class=\"token operator\">></span> vec<span class=\"token punctuation\">{</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Vector expandible</span>\n\nvec<span class=\"token punctuation\">.</span><span class=\"token function\">push_back</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Añadimos otro número al final del vector</span></code></pre></div>\n<p>¿Por qué menciono esto antes de explicar bien lo que es un vector? Porque algo que se hace muy a menudo con estructuras como esta es recorrer todos los elementos de esta y hacer alguna acción con ellos. La forma tradicional de hacer esto hasta 2011 era la siguiente:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\">std<span class=\"token double-colon punctuation\">::</span>vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">int</span><span class=\"token operator\">></span> vec<span class=\"token punctuation\">{</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\nstd<span class=\"token double-colon punctuation\">::</span>vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">int</span><span class=\"token operator\">></span><span class=\"token double-colon punctuation\">::</span>iterator it<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>it <span class=\"token operator\">=</span> vec<span class=\"token punctuation\">.</span><span class=\"token function\">begin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> it <span class=\"token operator\">!=</span> vec<span class=\"token punctuation\">.</span><span class=\"token function\">end</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>it<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>¿Engorroso, no es así? Fue por esto que en C++ se implementaron los <code class=\"language-text\">for</code> basados en rango, los cuales simplifican esta sintaxis y la convierten en esto:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> num <span class=\"token operator\">:</span> vec<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Como pueden ver, esta sintaxis es mucho más legible y cumple el mismo propósito. Al menos cuando se trate de recorrer una colección de cabo a rabo, esta última de escribir el <code class=\"language-text\">for</code> les ahorrará dolores de cabeza al necesitar menos código para cumplir el mismo objetivo, lo que hace al programa más mantenible y claro.</p>","fields":{"slug":"/posts/sintaxis-basica-cpp-parte-1","tagSlugs":["/tag/programming/","/tag/c/","/tag/espanol/"]},"frontmatter":{"date":"2021-03-16T19:00:00Z","description":"Una introducción a la sintaxis de C++.","tags":["Programming","C++","Español"],"title":"[ES] Sintáxis básica de C++ (parte 1)","socialImage":{"publicURL":"/static/f463ff7592afdee2e8660e64fb228e0c/photo.jpg"}}}},"pageContext":{"slug":"/posts/sintaxis-basica-cpp-parte-1"}},"staticQueryHashes":["251939775","3991641674","401334301"]}