¿Operador ternario ?: vs si … else

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

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

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

 const int x = (a 

No puedes hacer lo mismo con if-else .

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 comstackran con el mismo código.

No hay garantía de que comstackrá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 comstackdor y compruebe usted mismo lo que está sucediendo.

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

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 statement con un if / else generaría un código comstackdo muy diferente.


Actualización después de 8 años …

En realidad, creo que esto sería mejor:

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

(en realidad, estoy bastante seguro de que puedes reemplazar el “% d” en la primera cadena con “uno”)

Solo para ser un poco zurdo …

 x ? y : x = value 

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

Independientemente del código comstackdo, son semánticamente algo diferente. ?: es una expresión y if..else.. es una statement.

Aunque la syntax de la expresión condicional parece incómoda, es algo bueno. Se lo fuerza a proporcionar un 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.

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

Yo esperaría que en la mayoría de los comstackdores 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 comstackdores y plataformas. Si está escribiendo código de rendimiento crítico en un micro incrustado, observe lo que el comstackdor 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.

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

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.

Creo que hay situaciones en las que el código en línea puede generar un código “más rápido” debido al scope 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 scope 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 scope te obliga a tener en cuenta otros factores que el en línea si te permite evitar.

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 twigs conducen a la asignación de x.

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 statement 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 progtwigdor escriba fácilmente, pero para el comstackdor ambos son iguales. *

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