Diferencia entre revisiones de «Programación en C/Expresiones»

Contenido eliminado Contenido añadido
Gargo (discusión | contribs.)
Una referencia a la tabla con la precedencia de operadores en los anexos
Maxy (discusión | contribs.)
Sin resumen de edición
Línea 1:
<noinclude>
{{Navegar|anterior=Interacción con el usuario
|siguiente=Instrucciones de control
|reducido=Si
}}
</noinclude>
 
Vamos a tratar ahora de que el ordenador haga un poco de matemáticas para nosotros. Por ejemplo, que realice unas pocas sumas, restas multiplicaciones y divisiones.
 
<source lang=c>
<font color="purple"><code>#include</code></font><code> </code><font color="red"><code><stdio.h></code></font>
#include <stdio.h>
 
<font color="green"><code>int</code></font><code> main(</code><font color="green"><code>void</code></font><code>)</code>
int main(void)
<code>{</code>
{
<font color="green"><code>int</code></font><code> resultado;</code>
int resultado;
<code>resultado=</code><font color="red"><code>5</code></font><code>+</code><font color="red"><code>2</code></font><code>;</code>
<code>printf(</code><font color="red"><code>"Resultado de la suma:</code></font><code> </code><font color="purple"><code>%i</code></font><font color="purple"><code>\n</code></font><font color="red"><code>"</code></font><code>,resultado);</code>
<code>resultado=</code><font color="red"><code>5</code></font><code>-</code><font color="red"><code>2</code></font><code>;</code>
<code>printf(</code><font color="red"><code>"Resultado de la resta:</code></font><code> </code><font color="purple"><code>%i</code></font><font color="purple"><code>\n</code></font><font color="red"><code>"</code></font><code>,resultado);</code>
<code>resultado=</code><font color="red"><code>5</code></font><code>*</code><font color="red"><code>2</code></font><code>;</code>
<code>printf(</code><font color="red"><code>"Resultado de la multiplicación:</code></font><code> </code><font color="purple"><code>%i</code></font><font color="purple"><code>\n</code></font><font color="red"><code>"</code></font><code>,resultado);</code>
<code>resultado=</code><font color="red"><code>5</code></font><code>/</code><font color="red"><code>2</code></font><code>;</code>
<code>printf(</code><font color="red"><code>"Resultado de la división:</code></font><code> </code><font color="purple"><code>%i</code></font><font color="purple"><code>\n</code></font><font color="red"><code>"</code></font><code>,resultado);</code>
<font color="orange"><code>return</code></font><code>(</code><font color="red"><code>0</code></font><code>);</code>
<code>}</code>
 
resultado=5+2;
[[Programación en C (fundamentos):Ejemplos#Ejemplo de cálculo con enteros|<nowiki>[Página de ejemplos]</nowiki>]]
printf("Resultado de la suma: %i\n",resultado);
[[Programación en C (fundamentos):Ejemplos#Ejemplo comentado de cálculo con enteros|<nowiki>[Ejemplo comentado]</nowiki>]]
resultado=5-2;
printf("Resultado de la resta: %i\n",resultado);
resultado=5*2;
printf("Resultado de la multiplicación: %i\n",resultado);
resultado=5/2;
printf("Resultado de la división: %i\n",resultado);
return(0);
}
</source>
 
Después de grabarlo (por ejemplo, con el nombre <code>ejemplo.c</code>), lo compilamos y ejecutamos, con (respectivamente):
Línea 34 ⟶ 40:
Fijémonos en la línea del principio de la función <code>main</code>:
 
<source lang=c>
<font color="green"><code>int</code></font><code> resultado;</code>
int resultado;
</source>
 
Esta línea lo que hace es reservar un trozo de memoria, del tamaño de un <fontsource colorenclose="green"><codenone lang=c>int</code></fontsource> (4 bytes), y asignarle el nombre <code>resultado</code>, para poder después referirnos a él. A partir de este momento, podemos considerar que en nuestro programa existe una [[:w:Variable (programación)|variable]], que no tiene valor definido, pero a la que le podremos dar valor posteriormente.
 
Las líneas con <code>printf()</code> ya las conocemos, pero hay algo en ellas que no habíamos visto antes. Esos <fontsource colorenclose="purple"><codenone lang=c>%i</code></fontsource> y la parte de <code>,resultado</code> son nuevas para nosotros.
 
La función <code>printf()</code> no sólo sabe imprimir cadenas simples, como <fontsource colorenclose="red"><codenone lang=c>"Hola Mundo</code><font color="purple"><code>\n</code></font><code>"</code></fontsource>, sino también imprimir variables. Para ello, en el lugar de la cadena donde queremos que aparezca el valor de la variable, introducimos lo que se llama una cadena de conversión de <code>printf()</code>. Estas cadenas siempre empiezan por <fontsource colorenclose="purple"><codenone lang=c>%</code></fontsource>, siendo <fontsource colorenclose="purple"><codenone lang=c>%i</code></fontsource> la cadena para imprimir un entero, como es en nuestro caso <fontsource colorenclose="green"><codenone lang=c>int</code></font><code> resultado</codesource>. Finalmente, <code>printf()</code> debe saber qué valor escribir, por eso le damos otro argumento (u otros), usando <code>,</code> como separador, que contienen las variables cuyos valores queremos mostrar.
<table align="right"><tr><td><table border="1" cellspacing="0" cellpadding="3">
<tr><th colspan=2>Código de colores en <code>vim</code></th></tr>
<tr><td>anaranjado</td><td>palabras reservadas</td></tr>
<tr><td rowspan=2>rojo</td><td>constantes</td></tr>
<tr><!--td rowspan=2>rojo</td--><td>ficheros incluídos</td></tr>
<tr><td rowspan=3>púrpura</td><td>caracteres no imprimibibles</td></tr>
<tr><!--td rowspan=3>púrpura</td--><td>cadenas de conversión de <code>printf()</code></td></tr>
<tr><!--td rowspan=3>púrpura</td--><td>órdenes de preprocesador</td></tr>
<tr><td>verde</td><td>tipos de datos</td></tr>
</table></td></tr></table>
La función <code>printf()</code> no sólo sabe imprimir cadenas simples, como <font color="red"><code>"Hola Mundo</code><font color="purple"><code>\n</code></font><code>"</code></font>, sino también imprimir variables. Para ello, en el lugar de la cadena donde queremos que aparezca el valor de la variable, introducimos lo que se llama una cadena de conversión de <code>printf()</code>. Estas cadenas siempre empiezan por <font color="purple"><code>%</code></font>, siendo <font color="purple"><code>%i</code></font> la cadena para imprimir un entero, como es en nuestro caso <font color="green"><code>int</code></font><code> resultado</code>. Finalmente, <code>printf()</code> debe saber qué valor escribir, por eso le damos otro argumento (u otros), usando <code>,</code> como separador, que contienen las variables cuyos valores queremos mostrar.
 
En el resto del programa hemos visto cómo decirle al ordenador que ejecute una suma, una resta, una multiplicación y una división entera, con los operadores <code>+</code>, <code>-</code>, <code>*</code> y <code>/</code>. Es de notar que el resultado de una operación como estas entre números enteros será siempre otro entero, como se puede observar en la división, en la que no obtenemos un bonito decimal, sino un resultado entero. Además, hemos visto que el resultado de esas operaciones, que llamamos expresiones, puede ser asignado a una variable:
 
{| border="1" cellspacing="0" cellpadding="3"
{|
|Resultado
|-
|7
|}
 
Esa asignación se hace mediante el operador de asignación: <code>=</code>. Con él, ya conocemos cinco operadores.
 
Pero, como <code>=</code> también es un operador, ¿cómo sabe el ordenador qué operador debe ejecutar primero? Y si es un operador, ¿por qué no da un resultado? ¿No crea una expresión?
 
{|
<table align="right"><tr><td><table border="1" cellspacing="0" cellpadding="3">
<tr><th>|Operadores</th><th>|||Precedencia</th></tr>
|-
<tr><td><code>* /</code></td><td>Izq. a Der.</td></tr>
<tr><td>|<code>+* -/</code></td><td>||Izq. a Der.</td></tr>
<tr><td>|<code>=+ -</code></td><td>Der||Izq. a IzqDer.</td></tr>
|<code>{=</code> ||Der. a Izq.
</table></td></tr></table>
|}
Empezando por las últimas preguntas, el operador de asignación sí crea una expresión, como los operadores de suma, resta, multiplicación y división, y esa expresión tiene un resultado, que es el valor que obtiene el lado izquierdo al realizar la operación. En cuanto a saber qué se debe ejecutar primero, el ordenador tiene una lista de precedencia, según la cual siempre ejecuta primero las multiplicaciones y divisiones, de izquierda a derecha, a continuación las sumas y restas, de izquierda a derecha, y a continuación las asignaciones, de derecha a izquierda. Para mas detalles acerca de la precedencia de los operadores ver el [[Programación en C/Referencia#Operadores|anexo de los operadores]].
 
Empezando por las últimas preguntas, el operador de asignación sí crea una expresión, como los operadores de suma, resta, multiplicación y división, y esa expresión tiene un resultado, que es el valor que obtiene el lado izquierdo al realizar la operación. En cuanto a saber qué se debe ejecutar primero, el ordenador tiene una lista de precedencia, según la cual siempre ejecuta primero las multiplicaciones y divisiones, de izquierda a derecha, a continuación las sumas y restas, de izquierda a derecha, y a continuación las asignaciones, de derecha a izquierda. Para masmás detalles acerca de la precedencia de los operadores ver el [[Programación en C/Referencia#Operadores|anexo de los operadores]].
En cuanto a los caracteres de punto y coma, notamos aquí que una expresión también puede ser una sentencia por sí misma, sin necesidad de que haya ninguna función. De hecho, una sentencia puede no tener siquiera una expresión. La línea:
 
En cuanto a los caracteres de punto y coma, notamos aquí que una expresión también puede ser una sentencia por sí misma, sin necesidad de que haya ninguna función. De hecho, una sentencia puede no tener siquiera una expresión. La línea:
<code>;</code>
 
es una sentencia perfectamente válida, la sentencia vacía, que sera útil en puntos donde el lenguaje requiera una sentencia pero no sea necesaria para nuestro programa.
 
<noinclude>
{{Navegar|anterior=Interacción con el usuario
|siguiente=Instrucciones de control
|reducido=Si
}}
</noinclude>