jueves, 10 de mayo de 2012

El Operador Ternario ? : en C

El lenguaje de programación C proporciona una instrucción equivalente a la estructura de selección if else, el operador ternario ? : La estructura de esta instrucción es la siguiente:

Expresión1 ? Expresión2 : Expresión 3

La Expresión 1 se evalúa primero. Se trata de una expresión booleana, si no lo és, se convierte explícitamente en una. Esta sólo adopta los valores 'verdadero' o 'falso'; al igual que en el condicional if, cualquier cosa distinta de 0 se considera 'verdadero', en este caso se realiza la Expresión 2, pero no la Expresión 3. Si la Expresión 1 se evalúa como 'Falso', entoncesse realiza la Expresión 3, pero no la Expresión 2. Las expresiones 2 y 3 tienen que ser expresiones simples, no se admite un cuerpo de instrucciones agrupadas en corchetes y separadas por punto y coma.
El programa a continuación hace uso de esta expresión condicional.
Cópielo y ejecútelo.

/*+++++++++++++++++++++++++++++++++++++++++++++++++++
  *                                                 *
  * SE USA EL OPERADOR TERNARIO     ? :             *
  *                                                 *
  *+++++++++++++++++++++++++++++++++++++++++++++++++*/

 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++
  *                    ALGORITMO                         +
  *   1) Pedir un numero al usuario.                     +
  *   2) Recibir el numero                               +
  *   3) Si el numero es mayor que 0:                    +
  *         Imprimir "El numero es positivo"             +
  *      De lo contrario:                                +
  *         Imprimir "El numero no es positivo"          + 
  *                                                      +
  *++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

 /*////////////////////////////////////////////////////////////////
 // MAIN
 ////////////////////////////////////////////////////////////////*/

  #include <stdio.h>
  
  int main(void)
  {            /* Abre main */
  int x;
  printf("\nPor favor introduzca un numero entero:\n");
  scanf("%d", &x);
  
  printf( ( 0 < x) ? "\nEl numero es positivo\n":"\nEl numero no es positivo\n");
  
  return 0; 
  }            /* Cierra main */

______________________________________________________________________________________
Ahora hagamos un análisis del programa línea por línea para revisar cada instrucción.

/*+++++++++++++++++++++++++++++++++++++++++++++++++++
  *                                                 *
  * SE USA EL OPERADOR TERNARIO     ? :             *
  *                                                 *
  *+++++++++++++++++++++++++++++++++++++++++++++++++*/

 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++
  *                    ALGORITMO                         +
  *   1) Pedir un numero al usuario.                     +
  *   2) Recibir el numero                               +
  *   3) Si el numero es mayor que 0:                    +
  *         Imprimir "El numero es positivo"             +
  *      De lo contrario:                                +
  *         Imprimir "El numero no es positivo"          + 
  *                                                      +
  *++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

 /*////////////////////////////////////////////////////////////////
 // MAIN
 ////////////////////////////////////////////////////////////////*/

Estas línea contienen tres comentarios, iniciados con /* y terminados con */ El primero de ellos indica qué hace el programa, y éste se limita a ser un ejemplo básico de uso del operador ternario ? : El segundo comentario indica el algoritmo en seudocódigo del programa; son los pasos que realiza el programa; el tercero es una indicación de que empieza la función main.

 #include <stdio.h>

stdio.h significa "standard input-output header". La terminación .h es usada para identificar nombres de encabezados. Debe aparecer siempre en los programas que usan entrada y salida estándar.

int main(void)

Un encabezado de función incluye primero el tipo de datos que la función retorna. La función main retorna un entero, esa es la razón por la cual aparece la palabra int al principio de la línea. Algunas funciones retornan tipos float, tipos double, etc. Main sólo retorna tipos int. main es el nombre de la función. Si el compilador no encuentra en todo el archivo una función llamada main, no ejecuta nada. El control del programa empieza con la primera instrucción de la función main. Entre paréntesis aparece una palabra reservada nueva: void En el encabezado de una función, además aparecer el tipo de retorno y el nombre de la función, aparece, entre paréntesis, el tipo de datos que retorna dicha función. La función puede no retornar un valor, sino solamente el control del programa justo al punto desde donde fue invocada. En esos casos es práctica común escribir la palabra void (vacío) para declarar que no se retorna un dato.

{            /* Abre main */
  

Esta línea es conocida: { abre el bloque main. Algunos lenguajes, como Fortran, no usan llaves para delimitar los bloques de instrucciones, en esos lenguajes la lectura del código por parte del programador es bastante más difícil. C y lenguajes derivados limitan bloques con llaves {}.

 printf("\nPor favor introduzca un numero entero:\n");
 scanf("%d", &x);

Pedir y recibir un número del usuario son un par de instrucciones rutinarias a estas alturas. Con la función scanf podemos recibir más de un número a la vez, como lo veremos pronto.

printf( ( 0 < x) ? "\nEl numero es positivo\n":"\nEl numero no es positivo\n");
   

Observe cómo dentro de la función printf se toma una decisión. Si el número es mayor que 0 (0 < x), entonces se realiza la instrucción que aparece después de ? y antes de : se imprime el mensaje "El número es positivo."; de lo contrario se realiza la siguiente instrucción, la que se encuentra después de : se imprime "El numero no es positivo". Es incorrecto tratar de hacer esto con una instrucción if-else. Una línea como esta
printf( if ( 0 < x)  "\nEl numero es positivo\n" else "\nEl numero no es positivo\n");

Produce (en mi compilador, cc) el siguiente mensaje de error:

OperadorTernario.c: En la función ‘main’:
OperadorTernario.c:34:11: error: expected expression before ‘if’


Sin embargo, la instrucción también pudo haberse escrito de la siguiente forma:

(0 < x)? printf("\nEl numero es positivo\n"):printf("\nEl numero no es positivo.\n");

Observe la ausencia de punto y coma (;) después de printf. Expresión 2 y Expresión 3 son expresiones simples. Usted puede colocar instrucciones encerradas dentro de corchetes {} en cualquier parte donde pueda ir una instrucción simple, esa es una de las características de la programación estructurada. Pero NO en este caso. Tratar de convertir las instrucciones simples 2 y 3 a bloques no es aceptado por el compilador.
Uno de los principales usos de el operador ternario es tomar decisiones en una asignación. La siguiente línea

y = (x > 0) ? 1 : 0;

asigna el valor de 1 a la variable y en el caso de que la variable x sea positiva, de lo contrario le asigna 0. Los paréntesis en la Expresión 1 son opcionales, pero muy recomendables. El orden de precedencia de el operador ternario es muy bajo, pero superior a la asignación (=). Sin embargo, los dos operadores se evalúan de derecha a izquierda. En la línea anterior primero se evalúa x > 0 ? 1 : 0 y el resultado de esa expresión es el que se asigna a y. Los paréntesis hacen que el usuario entienda mejor qué hace la línea. Tenga mucho cuidado en observar que los tipos de datos en Expresión 2 y Expresión 3 sean iguales. Si no lo son, el compilador realizará conversiones de tipo que dependen de las reglas de conversión de tipos del lenguaje C. Estas conversiones pueden producir errores difíciles de detectar. NO declare tipos distintos para Expresión 2 y Expresión 3.

return 0; 
 }            /* Cierra main */

Este par de líneas indican el fin del programa.
_______________________________________________________________________________________________
Lo que aprendió:
El uso de printf con el operador ternario ? :
Asignaciones con el operador ternario ? :
El orden de precedencia del operador ternario ? :
_______________________________________________________________________________________________
Esta página forma parte del Curso de C con Programas Explicados Línea por Línea
Índice
Entrada Anterior
Entrada Siguiente

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...