Prediga la salida del siguiente programa C++.
#include <iostream> using namespace std; int main() { int test = 0; cout << "First character " << '1' << endl; cout << "Second character " << (test ? 3 : '1') << endl; return 0; }
Uno esperaría que la salida sea la misma en ambas declaraciones de impresión. Sin embargo, la salida será,
First character 1 Second character 49
¿Por qué la segunda declaración de impresión 49? Sigue leyendo la expresión ternaria.
Un operador ternario tiene la siguiente forma,
experiencia 1 ? experiencia 2 : experiencia 3
La expresión exp 1 se evaluará siempre. La ejecución de exp 2 y exp 3 depende del resultado de exp 1 . Si el resultado de exp 1 no es cero , se evaluará exp 2 ; de lo contrario, se evaluará exp 3 .
Efectos secundarios:
Cualquier efecto secundario de exp 1 se evaluará y actualizará inmediatamente antes de ejecutar exp 2 o exp 3 . En otras palabras, hay un punto de secuencia después de la evaluación de la condición en la expresión ternaria. Si exp 2 o exp 3 tienen efectos secundarios, solo se evaluará uno de ellos.
Tipo de devolución:
Es otro dato interesante. El operador ternario tiene tipo de retorno. El tipo de devolución depende de exp 2 y la convertibilidad de exp 3 en exp 2 según las reglas de conversión habituales\sobrecargadas. Si no son convertibles, el compilador arroja un error. Vea los ejemplos a continuación,
El siguiente programa compila sin ningún error. Se espera que el tipo de retorno de la expresión ternaria sea flotante (como el de exp 2 ) y exp 3 (es decir, cero literal – tipo int ) se convierte implícitamente en flotante.
#include <iostream> using namespace std; int main() { int test = 0; float fvalue = 3.111f; cout << (test ? fvalue : 0) << endl; return 0; }
El siguiente programa no se compilará porque el compilador no puede encontrar el tipo de retorno de la expresión ternaria o la conversión implícita no está disponible entre exp 2 ( char array ) y exp 3 ( int ).
#include <iostream> using namespace std; int main() { int test = 0; cout << test ? "A String" : 0 << endl; return 0; }
El siguiente programa *puede* compilar, pero falla en tiempo de ejecución. El tipo de retorno de la expresión ternaria está limitado al tipo ( char * ), pero la expresión devuelve int , por lo que el programa falla. Literalmente, el programa intenta imprimir una string en la dirección 0 en tiempo de ejecución.
#include <iostream> using namespace std; int main() { int test = 0; cout << (test ? "A String" : 0) << endl; return 0; }
Podemos observar que exp 2 se considera como tipo de salida y exp 3 se convertirá en exp 2 en tiempo de ejecución. Si la conversión es implícita, el compilador inserta stubs para la conversión. Si la conversión es explícita, el compilador arroja un error. Si algún compilador no detecta dicho error, el programa puede fallar en tiempo de ejecución.
Mejores prácticas:
Es el poder del sistema tipo C++ lo que evita tales errores. Asegúrese de que las expresiones exp 2 y exp 3 devuelvan el mismo tipo o al menos tipos convertibles de forma segura. Podemos ver otros modismos como C++ convert union para una conversión segura.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente. Estaremos encantados de aprender y actualizarnos de otros geeks.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA