| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 90
| Publicado: 23/09/2007 5:08 pm | | | Título: operador ternario |
| Hola!
Quisiera saber más sobre el operador ternario, sé que se trata de algo así:
Condición ? Expresión1 : Expresión2
En la condición deben estar implicadas las expresiones 1 y 2. Que tipo de expresiones se pueden llegar a poner.
Saludos!! |
|
| Volver arriba | |
 |
rir3760

Registrado: 01 Oct 2004 Mensajes: 3657 Ubicación: Mexico
| Publicado: 23/09/2007 8:07 pm | | | Título: Re: operador ternario |
| | Pantalàimon_ escribió: | | En la condición deben estar implicadas las expresiones 1 y 2. |
No entiendo a que te refieres con eso.
| Pantalàimon_ escribió: | | Que tipo de expresiones se pueden llegar a poner. |
El operador ternario tiene la estructura:
| Código: | expr_1 ? expr_2 : expr_3 |
Aqui expr_1 es cualquier expresion cuyo resultado sea de tipo entero (short, int, etc.), si este es verdadero (diferente de cero) se evalua la segunda expresion (expr_2) y si es falso (cero) se evalua la tercera expresion (expr_3).
La segunda y tercera expresion puedes ser expresiones de cualquier tipo y se tiene la garantia de que solo una de estas se evalua, esa es el resultado del operador y esto se complica en el caso de que estas sean de distinto tipo.
En el caso de dos expresiones de tipo aritmetico (enteros y flotantes) se realizan las "standart arithmetic promotions", el objeto de esas promociones es obtener un tipo comun (si te interesa ese tema lo mejor es comprar un buen libro. hay algunos recomendados en los foros y puedes obtener mas informacion utilizando el motor de busqueda).
Por ejemplo:
| Código: | (rand() % 2 != 0) ? 1.0 : 7UL; |
En este caso la segunda expresion es de tipo double mientras que la tercera es de tipo unsigned long, aqui independientemente del resultado de la primera expresion el resultado del operador es de tipo double, hay que tener esto en cuenta porque podria afectar expresiones que a primera vista son correctas.
Siguiendo el ejemplo (por cierto muy malo) esto:
| Código: | 7UL % ((rand() % 2 != 0) ? 1.0 : 7UL); |
No seria valido aun cuando el resultado de rand() sea un numero par.
Otra forma de verlo es pensar que esa expresion se procesa de esta forma:
| Código: | 7UL % ((rand() % 2 != 0) ? 1.0 : (double) 7UL); |
Donde ambas expresiones (segunda y tercera) tienen el mismo tipo (double).
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
|
| Volver arriba | |
 |
daltomi
Registrado: 28 Abr 2007 Mensajes: 114 Ubicación: Argentina
| Publicado: 23/09/2007 8:11 pm | | | Título: |
| Básicamente se trata de un Condicional Alternativo, pero en mi compilador(VC++) no se puede por ejemplo: Condicion ? break : (?) <- lo que sea
Yo generalmente lo utilizo en un return: return(a>0 ? true : false);
Ya que no puedo: a>0 ? return(true) : return(false)
Además puedo utilizarlo asi: Condición ? exp1, exp2 : exp3
otro ejemplo: Condición ? free(exp1), exp1=0, : 0 <-(cero)
Saludos. |
|
| Volver arriba | |
 |
|
rir3760

Registrado: 01 Oct 2004 Mensajes: 3657 Ubicación: Mexico
| Publicado: 23/09/2007 8:29 pm | | | Título: |
| | daltomi escribió: | Básicamente se trata de un Condicional Alternativo, pero en mi compilador(VC++) no se puede por ejemplo: Condicion ? break : (?) <- lo que sea |
Eso se debe a que el operador ternario requiere de tres expresiones y si bien las expresiones pueden convertirse en sentencias agregando el punto y coma final:
| Código: | if (2 + 2 /* expresion */){
/* ... */ }
2 + 2; /* sentencia */ |
El problema es que la inversa no aplica: las sentencias (declarativas, seleccion, repeticion, etc.) no pueden convertirse en expresiones.
| daltomi escribió: | Además puedo utilizarlo asi: Condición ? exp1, exp2 : exp3
otro ejemplo: Condición ? free(exp1), exp1=0, : 0 <-(cero) |
Eso se debe a que el operador secuencial (la ',') tiene la menor prioridad entre todos los operadores del lenguaje, la primera expresion es equivalente a:
| Código: | Condición ? (exp1, exp2) : exp3 |
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
|
| Volver arriba | |
 |
daltomi
Registrado: 28 Abr 2007 Mensajes: 114 Ubicación: Argentina
| Publicado: 23/09/2007 9:06 pm | | | Título: |
| Gracias rir por la aclaración. Saludos. |
|
| Volver arriba | |
 |
|
|