Disponible la versión 6 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


4.10  Sentencias C++

§1  Sinopsis

Las sentencias ("Statements") especifican y controlan el flujo de ejecución del programa. Si no existen sentencias específicas de selección o salto, el programa se ejecuta de forma secuencial en el mismo orden en que se ha escrito el código fuente (es el que podríamos considerar orden "natural" de ejecución).

En este capítulo explicaremos los distintos tipos de sentencias que existen en C++, pero antes ofreceremos una descripción formal de las mismas señalando qué se entiende por sentencia.

§2  Definición

Una expresión es una secuencia de operadores; operandos; elementos de puntuación y palabras clave, que especifican una computación. Tiene sentido computacional en sí misma y equivale a una frase en el lenguaje normal. Entre sus características distintivas están las de poder producir un resultado y posibles efectos laterales. Ejemplo:

extern x;        // No produce un valor
y = 22;          // Produce un valor
z = i++;         // Valor + efectos laterales


Cualquier expresión finalizada en un punto y coma ; forma una sentencia:

< expresión >;

C++ ejecuta las sentencias evaluando la expresión. Todos los efectos colaterales de la evaluación son tenidos en cuenta antes de ejecutar la próxima sentencia. La mayoría de sentencias C++ son asignaciones o llamadas a funciones.

Un caso especial es la sentencia nula; consiste en un punto y coma (;) aislado. Una sentencia nula no hace nada, pero puede ser necesaria en situaciones en que la sintaxis del lenguaje espere una sentencia pero nuestro programa no necesita hacer nada.

Nota: como la mayoría de las cosas de C++, la definición anterior tiene su excepción. Existe un tipo especial de sentencia, las directivas de preproceso en las que el punto y coma puede omitirse. Este tipo de sentencias no ejecuta una computación de tiempo de ejecución sino de compilación (realizan modificaciones sobre el fuente). Entre las que sí ejecutan una computación en runtime también existe una, las etiquetas directas, que no terminan en punto y coma sino en dos puntos :  (ver a continuación )

§2  Clasificación

Dada la definición anterior, resulta evidente que pueden existir infinitas sentencias distintas, e innumerables criterios para su clasificación. Una de las posibles, que además coincide con la clasificación del Estándar, distingue las siguientes clases de sentencia:

  • De etiqueta
  • De expresión
  • Compuestas
  • De selección
  • De iteración
  • De salto
  • De declaración
  • Bloques de intento

Además de las anteriores, por sus características especiales podríamos considerar las siguientes clases adicionales:

  • Sentencias de preproceso
  • Sentencias ensamblador
§2.1  Sentencias de etiqueta

En C++ existen tres clases de sentencias etiquetadas: las etiquetas directas ( 4.10.1a), las sentencias case ( 4.10.1b) y las default ( 4.10.1c), estas últimas se utilizan en conjunción con las sentencias switch.

§2.2  Sentencias de expresión

Podríamos decir que son las que no pertenecen a ninguno de los otros grupos y que, en la práctica, son las más abundantes. Generalmente son asignaciones o invocaciones de funciones. Ejemplo:

pint = &x;
foo(c);

§2.3  Sentencias compuestas

Las sentencias compuestas, también denominadas bloques ( 1.3.1) se utilizan en aquellas situaciones en que la sintaxis espera una sentencia pero se necesita usar varias. Ejemplo:

if (first) ++x;
else {
   --x; z = a;
}

En caso de cumplirse la condición hay que incrementar x, lo que puede hacerse en una sola sentencia, pero si la condición resulta falsa, se precisan dos computaciones. Para que se comporten como una sola frente a else, se recurre a englobarlas en un bloque entre llaves { ... }. Las sentencias dentro del bloque se comportan como una sola y constituyen un ámbito léxico. Los identificadores definidos en su interior eclipsan a los exteriores y las variables automáticas creadas en él son destruidas al salir del ámbito.

§2.4  Sentencias de selección

Las sentencias de selección o de control de flujo, pueden decidir entre varios cursos de acción distintos en función de ciertos valores. Existen dos tipos de estas sentencias de selección: if...else ( 4.10.2) y switch ( 4.10.2).

Ejemplos:

switch ( foo() ) {
    case 0: case 1:
       if (first) break;
       else ++x;
    case 2:
       ...
    default:
       break;
}

§2.5  Sentencias de iteración

Las sentencias de iteración permiten repetir un conjunto de sentencias ejecutando un bucle.  En C++ existen tres formas de iteraciones: los bucles while ( 4.10.3), do…while ( 4.10.3) y for ( 4.10.3).

Ejemplo:

while (first) {

   ...

   for (int x = 1; x < y; ++x) {

      ...

      do {                  // begin second

         ...

         ...

      } while (second);     // end second

      ...

   }      // end for

   ...

}         // end first

§2.6  Sentencias de salto

Las sentencias de salto permiten transferir el control del programa de forma incondicional. Existen cuatro de estas sentencias: break ( 4.10.4), continue ( 4.10.4), ( 4.10.4) y return ( 4.10.4).

Ejemplo:

while (foo) {

    start:

    if (some) break;

    ...

    if (first) goto start;

    ...

    if (second) continue;

    ...

    if (! any) return;

    ...

}

Nota: en ocasiones es posible utilizar el mecanismo de excepciones C++ como mecanismo de salto multinivel ( 1.6).

§2.7  Sentencias de declaración

Este tipo de sentencias introducen uno o más identificadores en un bloque. Ejemplo:

void foo (int x, y z) {

   float f = 3.14;

   char c;

   int x;

   ...

}

El asunto es tratado extensamente en el capítulo "Declaraciones y definiciones" ( 4.1.2).

§2.8  Bloques de intento

Estas sentencias deben estar seguidas de una sentencia catch y tienen la forma:

try {

   ...

}

Son utilizadas por el mecanismo de excepciones C++ y han sido expuestas con detalle en el capítulo correspondiente ( 1.6)

§2.9  Sentencias de preproceso

Como se ha indicado, constituyen un tipo muy especial, tanto en su sintaxis como en su comportamiento. No representan una computación en tiempo de ejecución (runtime), sino de compilación, ya que su efecto es realizar modificaciones sobre el código fuente [1]. Su sintaxis también es especial; no requieren el punto y coma de terminación y comienzan siempre con el símbolo #  ( 4.9.10).

§2.10  Sentencias ensamblador

C++ dispone de la opción de poder escribir directamente instrucciones en lenguaje ensamblador junto con el resto del código fuente. Para esto dispone de una palabra clave específica: asm.

La palabra asm indica que la cadena literal que sigue será incluida en el código objeto en la posición indicada.

La sintaxis empleada depende del compilador. En el caso de C++Builder, es la siguiente:

asm <opcode> <operandos> <; o NL>

Ejemplo

asm pop dx;

asm push ebx;

asm call @@std@%basic_ostream$c19std@%char_traits$c%%@put$qc;

asm add esp,8;

asm push ebx;

Se permite que varias instrucciones ensamblador pueden ser agrupadas en un solo bloque precedido por el indicador asm. Ejemplo:

asm {
  mov ax, 0x0e07;
  xor bx, bx;
  int 0x10;
}


La sintaxis empleada por el compilador C++ GNU para Windows utilizado por Dev-C++ no utiliza la sintaxis de Intel, sino la de AT&T.

Ejemplo [2]:

int AdrIO;            // variable global
static char ValIO;    // variable global

void foo() {
  __asm("mov _AdrIO, %dx") ;  // cargar un registro de 16 bits
  __asm("mov _ValIO, %al") ;  // cargar un registro de 8 bits
  __asm("mov %ax,%dx") ;      // mover contenido registro AX a DX

Nota: no olvidar incluir el guión bajo ("underscore") precediendo los nombres de variables globales.

Ni que decir tiene que cualquier código ensamblador insertado mediante asm, es específico, y por tanto dependiente, de la plataforma sobre la que se ejecutará el programa. Este tipo de sentencias deben reducirse al máximo si queremos facilitar la portabilidad del código.

  Temas relacionados
  • Estructura lógica de un programa: Sentencias y Expresiones ( 1.3.1)
  • Sintaxis de las sentencias C++ ( 1.3.1a)
  • Sintaxis de las expresiones C++ ( 1.3.1b)

  Inicio.


[1]  En este sentido, las funciones y clases genéricas (plantillas), también pueden ser consideradas como sentencias que tienen efecto sobre el código fuente ( 4.12).

[2]  Ejemplo tomado de Dev-C++ 5 Help File.