flujo de controlpág. 1 de 29 expresiones y sentencias ä se entiende por expresión una...
TRANSCRIPT
FLUJO DE CONTROL Pág. 1 de 29
EXPRESIONES Y SENTENCIAS
Se entiende por expresión una combinación de operadores y operandos que tiene un valor.
El valor se puede averiguar realizando las operaciones en el orden dictado por la precedencia de los operadores.
FLUJO DE CONTROL Pág. 2 de 29
EXPRESIONES Y SENTENCIAS
Una expresión se transforma en sentencia simple cuando va seguida de un punto y coma; las sentencias son las piezas con las que se construye un programa.
Expresiones Sentencias Valor3 3; 3
x = 0 x = 0; 0i++ i++; ?
5 > 3 5 > 3; 16 + (c=3+8) 6 + (c=3+8); 17
El punto y coma se denomina terminador de sentencias (en Pascal, separador de sentencias).
FLUJO DE CONTROL Pág. 3 de 29
EXPRESIONES Y SENTENCIAS Expresiones compuestas, operador coma.
El operador coma se utiliza para unir varias expresiones.
Una secuencia de expresiones separadas por el operador coma se evalúa de izquierda a derecha.
El valor de la expresión global es el de la expresión más a la derecha (pero puede depender de la evaluación de las otras expresiones).
x = (y=3, y+1) x vale 4x = (y=20, y=y-5, 30/y) x vale 2
El operador coma es el operador de menor precedencia.
FLUJO DE CONTROL Pág. 4 de 29
EXPRESIONES Y SENTENCIAS: Sentencias compuestas, bloques
Se denomina sentencia compuesta o bloque a un conjunto de sentencias encerradas entre llaves {}.
Las sentencias situadas dentro de las llaves pueden ser declaraciones, otras sentencias compuestas o sentencias de flujo de control.
Toda función debe contener al menos una sentencia compuesta.
FLUJO DE CONTROL Pág. 5 de 29
EXPRESIONES Y SENTENCIAS Sentencias compuestas, bloques
Es frecuente que las sentencias de flujo de control se compongan de sentencias compuestas.
Detrás de la llave que finaliza una sentencia compuesta o bloque no se pone un punto y coma.
FLUJO DE CONTROL Pág. 6 de 29
EXPRESIONES Y SENTENCIAS Sentencias de flujo de control
Las sentencias de flujo de control modifican la ejecución secuencial de las sentencias que forman el programa.
Se clasifican en tres grupos: sentencias de selección: if-else, switch sentencias de iteración: while, do-while, for sentencias de salto: break, continue, goto, return
FLUJO DE CONTROL Pág. 7 de 29
SENTENCIAS CONDICIONALESif-else
Las sentencias condicionales se utilizan para ejecutar selectivamente un conjunto de sentencias, según se satisfaga o no una condición.
La sentencia if-else se utiliza para ejecutar uno de dos posibles conjuntos alternativos de sentencias, dependiendo del resultado de evaluar una expresión.
FLUJO DE CONTROL Pág. 8 de 29
SENTENCIAS CONDICIONALES if-else
La sintaxis de la sentencia if-else es:
if ( expresión )
/* si expresión se evalúa a un valor distinto de 0 */ sentencia 1
else /* si expresión se evalúa a 0 */ sentencia 2
FLUJO DE CONTROL Pág. 9 de 29
SENTENCIAS CONDICIONALESif-else
expresión debe encontrarse siempre entre paréntesis y las sentencias sentencia 1 y sentencia 2 pueden ser simples o compuestas (bloques).
Siendo opcional la parte else, la aparente ambigüedad de ciertas configuraciones de sentencias if-else anidadas se resuelve como sigue: la parte else se asocia con el if sin else más próximo del mismo bloque.
FLUJO DE CONTROL Pág. 10 de 29
SENTENCIAS CONDICIONALES switch
La sentencia switch es una forma alternativa de if anidados para evaluar decisiones múltiples.
Su sintaxis es: switch ( expresión ) { ... case expr_cte1: case expr_cteN:
lista_sentencias 1 lista_sentencias N break; break; case expr_cte2: default: lista_sentencias 2 lista_sentencias break; break; ... }
FLUJO DE CONTROL Pág. 11 de 29
SENTENCIAS CONDICIONALES switch
Cuando el valor de expresión no se corresponde con ninguna de las expr_cte y existe el caso default, se ejecuta la lista_sentencias correspondiente a éste caso.
Las palabras clave case y default no interrumpen por sí mismas el flujo de control del programa; por ello es necesario una sentencia de salto (normalmente la instrucción break).
Una sentencia switch es más eficiente que una escalera de if-else.
FLUJO DE CONTROL Pág. 12 de 29
SENTENCIAS CONDICIONALES Switch, Advertencias
No pueden existir dos casos iguales en un mismo switch (un mismo caso, sí puede ocurrir en distintos switch anidados).
Si se omite el break al final de un caso, el programa pasa a ejecutar las sentencias de los casos siguientes hasta encontrar un break o hasta el final del switch.
Se recomienda situar el caso default en último lugar e incluir siempre un break al final de su secuencia de sentencias asociada.
FLUJO DE CONTROL Pág. 13 de 29
SENTENCIAS REPETITIVASwhile
Las sentencias repetitivas se utilizan para seguir ejecutando una sentencia o un conjunto de sentencias mientras se cumpla una cierta condición.
La sintaxis del while es:
while ( expresión ) sentencia
FLUJO DE CONTROL Pág. 14 de 29
SENTENCIAS REPETITIVAS while
sentencia, simple o compuesta, se ejecutará repetidamente mientras el valor de expresión sea distinto de cero (cierta) .
La comprobación de expresión se realiza antes de la ejecución de sentencia, y por tanto puede que ésta no se ejecute ni una vez.
El cuerpo del while puede estar vacío, es decir, estar formado por la sentencia nula, p.e.:
while ( (car=getchar()) != ‘A’ ) ;
FLUJO DE CONTROL Pág. 15 de 29
SENTENCIAS REPETITIVASdo-while
La sintaxis es:
dosentencia
while ( expresión );
sentencia se ejecuta repetidamente mientras el valor de expresión sea distinto de cero (cierta).
FLUJO DE CONTROL Pág. 16 de 29
SENTENCIAS REPETITIVASdo-while
La comprobación de expresión se realiza después de la ejecución de sentencia, y por tanto ésta siempre se ejecuta al menos una vez.
Aunque las llaves no son necesarias cuando sentencia es una sentencia simple, se aconseja utilizarlas para mejorar la legibilidad
FLUJO DE CONTROL Pág. 17 de 29
SENTENCIAS REPETITIVASfor
Es la más frecuentemente usada para crear bucles;su sintaxis es:
for ( expresión 1; expresión 2; expresión 3 )sentencia
expresión 1: especifica la inicialización del bucle; se ejecutará una sola vez.
expresión 2: especifica la comprobación que se realizará antes de cada iteración.
expresión 3: especifica las instrucciones que se ejecutarán al final de cada iteración.
FLUJO DE CONTROL Pág. 18 de 29
SENTENCIAS REPETITIVASfor
El bucle se abandona cuando expresión 2 vale 0 (la condición no se cumple).
El bucle for es equivalente a un bucle while:expresión 1;while ( expresión 2 ) {
sentenciaexpresión 3;
}
FLUJO DE CONTROL Pág. 19 de 29
SENTENCIAS REPETITIVASfor
Todas las expresiones son opcionales pero deben de mantenerse los puntos y comas.
for (;;) ;
En el caso de no especificarse expresión 2 se considera que siempre es cierta, con lo que el bucle se ejecutará indefinidamente.
FLUJO DE CONTROL Pág. 20 de 29
SENTENCIAS REPETITIVASfor
Los límites del bucle pueden alterarse desde el interior del propio bucle, p.e.:
for ( n=1; n<10000; n+=delta ){
...delta--;
}
Las variables de control mantienen su valor tras la ejecución de éste
FLUJO DE CONTROL Pág. 21 de 29
SENTENCIAS REPETITIVASfor
Se pueden utilizar dos o más variables de control:for ( i=0, j=0; i+j<10; i++, j+=2 )
printf( “%d %d\n”, i, j );
El cuerpo del for puede estar vacío, es decir, estar formado por la sentencia nula, p.e.:
for( x=1, y=1; x<MAX; y*=x++ ) ;
También se puede salir de un bucle mediante una instrucción de salto (p.e. el caso del bucle infinito)
FLUJO DE CONTROL Pág. 22 de 29
SENTENCIAS DE SALTO
Las sentencias de salto se utilizan para alterar de manera incondicional el orden de ejecución de las sentencias de un programa.
Sólo deberían utilizarse con el fin de simplificar o mejorar los algoritmos.
Las sentencias condicionales o repetitivas no deben sustituirse nunca por sentencias de salto, ya que generan programas más difíciles de seguir, más propensos a errores y mas difíciles de modificar.
FLUJO DE CONTROL Pág. 23 de 29
SENTENCIAS DE SALTObreak
Se utiliza para terminar la ejecución de bucles o para salir de una sentencia switch.
Su sintaxis es:
break;
FLUJO DE CONTROL Pág. 24 de 29
SENTENCIAS DE SALTObreak
Se utiliza en un bucle while, do-while o for para transferir el control a la siguiente sentencia fuera del bucle.
while( ... ) { while ( ... ) {... ...break; while( ... ) {... ...
} break;/* salto hasta aquí */ ...
} ... /* salto hasta aquí
*/ }
Es de especial utilidad cuando existe un suceso externo que controla un bucle.
FLUJO DE CONTROL Pág. 25 de 29
SENTENCIAS DE SALTOcontinue
Se utiliza en un bucle while, do-while o for para transferir el control al final del cuerpo del bucle (concluye la iteración). Su sintaxis es:
continue;
En los bucles while y do-while después de un continue, se pasa a comprobar la condición de finalización.
En los bucles for después de un continue se evalúa la tercera expresión de la sentencia for y después se comprueba la condición de finalización.
FLUJO DE CONTROL Pág. 26 de 29
SENTENCIAS DE SALTOgoto
El control del flujo de un programa puede alterarse incondicionalmente usando la sentencia goto.Su sintaxis es:
goto identificador;
El identificador es una etiqueta que se utiliza para señalar la sentencia a la que se transfiere el control dentro de la misma función.Su sintaxis es:
identificador: sentencia
FLUJO DE CONTROL Pág. 27 de 29
SENTENCIAS DE SALTOgoto
La sentencia goto sólo debería usarse para salir de un conjunto de bucles anidados en caso de error.
Advertencias: Cualquier otro uso es prescindible, y su uso siempre
destruye la estructura del programa. Dos sentencias no pueden tener el mismo
identificador
FLUJO DE CONTROL Pág. 28 de 29
SENTENCIAS DE SALTOreturn
Esta sentencia devuelve el control desde el interior de una función a la sentencia que sigue a su llamada.Su sintaxis es:
return expresión;
El valor que devuelve la función que la contiene es el resultado de evaluar expresión (en el caso del main, el valor se devuelve al entorno y el programa finaliza).
La sentencia return puede utilizarse sin expresión asociada.
FLUJO DE CONTROL Pág. 29 de 29
SENTENCIAS DE SALTOreturn
Si la sentencia lleva una expresión asociada, el valor devuelto se convierte, como si de una asignación se tratara, al tipo indicado en la definición de la función.
Salir de una función por su última sentencia (seguida por }) equivale a realizar un return sin expresión asociada.
En una misma funcion puede existir más de una sentencia return.