Sentencias

Las sentencias pueden ser las siguientes:

Las sentencias especifican el flujo de control a medida que se ejecuta un programa de idioma del usuario. Si no hay sentencias de control específicas, se ejecutan secuencialmente en el orden de aparición en el archivo ULP.

Sentencia compuesta (AD)

Una sentencia compuesta, también conocida como bloque, es una lista (posiblemente vacía) de sentencias entre llaves coincidentes ({ }). En cuanto a la sintaxis, un bloque se puede considerar una sola sentencia, pero también controla el ámbito de los identificadores. Un identificador que se declare dentro comienza en el punto de declaración y termina en la llave de cierre.

Las sentencias compuestas se pueden anidar a cualquier profundidad.

Sentencia de expresión

Una sentencia de expresión es cualquier expresión seguida de un punto y coma.

Se ejecuta evaluando la expresión. Todos los efectos secundarios de esta evaluación se completan antes de que se ejecute la siguiente sentencia. La mayoría de las sentencias de expresión son asignaciones o inicios de funciones.

Un caso especial es la sentencia vacía, que consta de un punto y coma. Una sentencia vacía no hace nada, pero puede ser útil en situaciones en las que la sintaxis de ULP espere una sentencia, pero el programa no la necesite.

Sentencias de control

Las sentencias de control se utilizan para controlar el flujo del programa.

Las sentencias de iteración son

do...while
for
while

Las sentencias de selección son

if...else
switch

Las sentencias de salto son

break
continue
return

break

La sentencia break cuenta con la sintaxis general

break;

y termina inmediatamente la sentencia do...while, for, switch o while de cierre más cercana. Esto también se aplica a los miembros de bucle de tipos de objetos.

Dado que todas estas sentencias se pueden mezclar y anidar hasta cualquier profundidad, compruebe que break sale de la sentencia correcta.

continue

La sentencia continuar cuenta con la sintaxis general

continue;

y transfiere inmediatamente el control a la condición de prueba de la sentencia do...while, while o for más cercana, o a la expresión de incremento del cierre más cercano a la sentencia.

Dado que todas estas sentencias se pueden mezclar y anidar hasta cualquier profundidad, compruebe que continue afecta a la sentencia correcta.

do...while

La sentencia do...while cuenta con la sintaxis general

do statement while (condition);

y ejecuta la sentencia hasta que la expresión de condición pasa a ser cero. La condición se prueba después de la primera ejecución de la sentencia, lo que significa que siempre se ejecuta al menos una vez.

Si no hay ningún break o return dentro de ella, la sentencia debe afectar al valor de la condición, o bien la condición en sí debe cambiar durante la evaluación para evitar un bucle infinito.

Ejemplo:

string s = "Trust no one!";
int i = -1;
do {
   ++i;
   } while (s[i]);

for

La sentencia for cuenta con la sintaxis general

for ([init]; [test]; [inc]) statement

y lleva a cabo los siguientes pasos:

  1. Si hay una expresión init, se ejecuta.
  2. Si hay una expresión test, se ejecuta. Si el resultado es distinto de cero (o si no hay ninguna expresión de prueba), se ejecuta la sentencia.
  3. Si hay una expresión inc, se ejecuta.
  4. Por último, el control vuelve al paso 2.

Si no hay ningún break o return dentro de ella, la expresión inc (o la sentencia) debe afectar al valor de la expresión test, o bien la prueba en sí debe cambiar durante la evaluación para evitar un bucle infinito.

La expresión de inicio init normalmente inicializa uno o más contadores de bucle. También puede definir una nueva variable como contador de bucle. El ámbito de dicha variable es válido hasta el final del bloque que incluya el bucle for.

Ejemplo:

string s = "Trust no one!";
int sum = 0;
for (int i = 0; s[i]; ++i)
    sum += s[i]; // sums up the characters in s

if...else

La sentencia if...else cuenta con la sintaxis general

if (expression)
   t_statement
[else
   f_statement]

Se evalúa la expresión condicional y, si su valor es distinto de cero, se ejecuta t_statement. De lo contrario, la sentencia f_statement se ejecuta en caso de que exista una cláusula else.

Una cláusula else siempre coincide con la última if que se encuentre sin un else. Si no es así, debe utilizar llaves para agrupar las sentencias, como en

if (a == 1) {
   if (b == 1)
      printf("a == 1 and b == 1\n");
   }
else
   printf("a != 1\n");

return

Una función con un tipo return que no esté vacía debe contener al menos una sentencia return con la sintaxis

return expression;

donde expression debe evaluarse como un tipo que sea compatible con el tipo de return de la función. El valor de expression es el valor devuelto por la función.

Si la función es de tipo vacío, se puede utilizar una sentencia return sin una expression para volver desde el inicio de la función.

switch

La sentencia switch cuenta con la sintaxis general

switch (sw_exp) {
  case case_exp: case_statement
  ...
  [default: def_statement]
  }

y permite transferir el control a una de las sentencias con nombre de caso, según el valor de sw_exp (que debe ser de tipo integral).

Cualquier case_statement se puede etiquetar mediante uno o varios nombres de caso. La case_exp de cada nombre de caso debe evaluarse como un número entero constante, único dentro de la sentencia switch cerrada.

También puede haber como máximo un nombre predeterminado.

Después de evaluar sw_exp, se comprueba si existe una coincidencia en case_exp. Si se encuentra una coincidencia, el control pasa a case_statement con el nombre de caso coincidente. Si no se encuentra ninguna coincidencia y hay una etiqueta predeterminada, el control pasa a def_statement. De lo contrario, no se ejecuta ninguna de las sentencias switch.

La ejecución del programa no se ve afectada cuando se encuentran nombres de caso y predeterminadas. El control simplemente pasa a través de los nombres a la siguiente sentencia.

Para detener la ejecución al final de un grupo de sentencias para un caso concreto, utilice la sentencia break.

Ejemplo:

string s = "Hello World";
int vowels = 0, others = 0;
for (int i = 0; s[i]; ++i)
    switch (toupper(s[i])) {
      case 'A':
      case 'E':
      case 'I':
      case 'O':
      case 'U': ++vowels;
                break;
      default: ++others;
      }
printf("There are %d vowels in '%s'\n", vowels, s);

while

La sentencia while cuenta con la sintaxis general

while (condition) statement

y ejecuta la sentencia siempre que la expresión condition no sea cero.

La condición se prueba antes de la primera ejecución posible de la sentencia, lo que significa que la sentencia no se puede ejecutar nunca si la condición es inicialmente cero.

Si no hay ningún salto o retorno dentro de ella, la sentencia debe afectar al valor de la condición, o bien la condición en sí debe cambiar durante la evaluación para evitar un bucle infinito.

Ejemplo:

string s = "Trust no one!";
int i = 0;
while (s[i])
      ++i;