break; continue; goto; operador condicional
Las primeras tres sentencias permiten interrumpir el flujo normal de una estructura de control.
El break; produce la salida inmediata del while, for, do o switch en que se encuentra, por ej.:
while(1)
{
scanf("%lf",&x);
if (x < 0.0)
break; /* salgo del while si x es negativo ... */
printf("%lf\n",sqrt(x));
}
/* ... y vengo a parar acá */
printf("Ingresaste un número negativo!!!\n");
El continue; termina la ejecución de la iteración actual del while, for o do y pasa directamente a la siguiente iteración, por ej.:
for(i=0; i<20; i++)
{
if (i == 13)
continue; /* programador supersticioso */
printf("%d\n",i);
/* el continue transfiere el control a este punto
para comenzar con la nueva iteración */
}
El goto produce un salto incondicional a una sentencia con una etiqueta que se encuentra en algún lugar dentro de la misma función. Por los efectos nocivos que tiene el abuso del goto sobre la programación estructurada más que una estructura de control es muchas veces considerado una fuente de descontrol. De ser posible debe evitarse su uso. Un posible ejemplo de uso es el siguiente:
for(i=0; i<100; i++)
for (j=0; j<100; j++)
{
if (i*j == i+j )
goto afuera; /* con un break sólo hubiera
salido del bucle de j */
printf("%d\n",i);
}
afuera: printf("Salida de emergencia?\n");
El operador condicional tiene 3 argumentos ( bastante inusual para un
operador!!) cond ? expr1 : expr2;
Si cond es verdadero entonces evalúa y toma el valor de expr1 si es falso entonces el de expr2, por lo tanto puede ser usado para realizar el trabajo de una sentencia if-else, por ej.:
if (y < z)
x = y;
else
x = z;
/* es equivalente a: */
x = (y < z) ? y : z;
Los paréntesis en la condición no son necesarios ya que el operador < tiene precedencia, sin embargo hacen más clara la expresión total y por eso se los suele utilizar. Si expr1 y expr2 fueran de distinto tipo, se aplican las reglas de conversión usuales, de forma que el tipo del resultado sea el de mayor precisión (es decir si expr1 es un int y expr2 es un double el resultado siempre será un double aún cuando sea expr1 la evaluada.