ternarios ternario operadores operador ejemplo condicional c++ performance conditional-operator

c++ - operadores - return operador ternario



¿Operador ternario ?: vs si... else (14)

En C ++, ¿el operador?: Es más rápido que if () ... else? ¿Hay alguna diferencia entre ellos en el código compilado?


Ahora que no puedo ayudarte con eso, puedo ayudarte con una pregunta secundaria debajo, ¿quiero usarla? Si solo quieres saber la velocidad, simplemente ignora mi comentario.

Todo lo que puedo decir es que seas muy inteligente sobre cuándo usar el ternario. : operador. Puede ser tanto una bendición como una maldición para la lectura.

Pregúntese si le resulta más fácil de leer antes de usarlo

int x = x == 1 ? x = 1 : x = 1; if (x == 1) { x = 1 } else { x = 2 } if (x == 1) x = 1 else x = 1

Sí Parece estúpido hacer que el código sea 100% falso. Pero ese pequeño truco me ayudó a analizar mi legibilidad de código. Es la legibilidad del operador que mira en esta muestra, y no el contenido.

Se ve limpio, pero también lo hace el asiento del inodoro y el pomo de la media

En mi experiencia, que es limitada, he visto a muy poca gente realmente pudiendo extraditar rápidamente la información requerida por un operador ternario, evítelo a menos que esté 100% seguro de que es mejor. Me duele arreglarlo cuando está estropeado y creo


Creo que hay situaciones en las que el código en línea puede generar un código "más rápido" debido al alcance en el que funciona. La creación y destrucción de objetos puede ser costosa, así que considere el siguiente escenario:

class A{ public: A() : value(0) { cout << "Default ctor" << endl; } A(int myInt) : value(myInt) { cout << "Overloaded ctor" << endl; } A& operator=(const A& other){ cout << "= operator" << endl; value = other.value; } ~A(){ cout << "destroyed" << std::endl; } int value; }; int main() { { A a; if(true){ a = A(5); }else{ a = A(10); } } cout << "Next test" << endl; { A b = true? A(5) : A(10); } return 0; }

Con este código, la salida será:

Default ctor Overloaded ctor = operator destroyed destroyed Next test Overloaded ctor destroyed

Entonces, al marcar el if, ahorramos un montón de operaciones necesarias para mantener a vivo en el mismo alcance que b . Si bien es muy probable que la velocidad de evaluación de la condición sea bastante igual en ambos escenarios, cambiar el alcance te obliga a tener en cuenta otros factores que el en línea si te permite evitar.


Depende de tu compilador, pero en cualquier compilador moderno generalmente no hay diferencia. Es algo de lo que no debes preocuparte. Concéntrese en la mantenibilidad de su código.


Durante la inversión de algún código (que no recuerdo, hace unos años) vi una diferencia de línea única entre el código de máquina de:? y si-else Don''t remember much but it is clear that implementation of both is different.

Pero le aconsejo que no elija uno de ellos porque su eficiencia, elija según la legibilidad del código o su conveniencia. Happy Coding


En CA, el operador ternario "?:" Está disponible para construir expresiones condicionales del formulario

exp1 ? exp2:exp3

donde exp1, exp2 y exp3 son expresiones

por ejemplo

a=20; b=25; x=(a>b)?a:b; in the above example x value will be assigned to b;

Esto se puede escribir usando if..else declaración de la siguiente manera

if (a>b) x=a; else x=b;

** Por lo tanto, no hay diferencia entre estos dos. Esto para que el programador escriba fácilmente, pero para el compilador ambos son iguales. *


He visto a GCC convertir el operador condicional en cmov (movimiento condicional), mientras se convierten las instrucciones if en branches, lo que significaba que en nuestro caso, el código era más rápido cuando se usaba el operador condicional. Pero eso fue hace un par de años, y lo más probable es que hoy en día, ambos compilaran con el mismo código.

No hay garantía de que compilarán con el mismo código. Si necesita el rendimiento, entonces, como siempre, mida . Y cuando haya medido y descubierto que 1. su código es demasiado lento, y 2. este es un trozo particular de código que es el culpable, entonces estudie el código ensamblador generado por el compilador y compruebe usted mismo lo que está sucediendo.

No confíe en reglas de oro como "el compilador siempre generará un código más eficiente si utilizo el operador condicional".


Independientemente del código compilado, son semánticamente algo diferente. <cond>?<true expr>:<false expr> es una expresión y if..else.. es una declaración.

Aunque la sintaxis de la expresión condicional parece incómoda, es algo bueno. Se lo fuerza a proporcionar un <false expr> y las dos expresiones son de tipo checked.

El equivalente a if..else.. en lenguaje funcional basado en expresiones como Lisp, Haskell es ? : ? : en C ++, en lugar de if..else.. statement.


No es más rápido. Hay una diferencia cuando puede inicializar una variable constante dependiendo de alguna expresión:

const int x = (a<b) ? b : a;

No puedes hacer lo mismo con if-else .


No estás obligado a poner todo en una sola línea:

x = y==1 ? 2 :// else 3;

Es mucho más claro que si / else porque puede ver inmediatamente que ambas ramas conducen a la asignación de x.


No, se convierten exactamente en el mismo código ejecutable.


Solo para ser un poco zurdo ...

x ? y : x = value

asignará valor a y si x no es 0 (falso).


Son lo mismo, sin embargo, el operador ternario se puede usar en lugares donde es difícil usar un if / else:

printf("Total: %d item%s", cnt, cnt != 1 ? "s" : "");

Hacer esa declaración con un if / else generaría un código compilado muy diferente.


Ternary Operator siempre devuelve un valor. Por lo tanto, en una situación en la que desee obtener algún valor de salida del resultado y solo haya 2 condiciones, siempre será mejor utilizar el operador ternario. Use if-else si alguna de las condiciones mencionadas anteriormente no es verdadera.


Yo esperaría que en la mayoría de los compiladores y plataformas de destino, habrá casos en los que "si" es más rápido y en los que?: Es más rápido. También habrá casos en que una forma sea más o menos compacta que la otra. Los casos que favorecen una forma u otra variarán entre compiladores y plataformas. Si está escribiendo código de rendimiento crítico en un micro incrustado, observe lo que el compilador genera en cada caso y vea cuál es mejor. En una PC "mainstream", debido a problemas de almacenamiento en caché, la única forma de ver cuál es mejor es comparar ambas formas en algo parecido a la aplicación real.