Pregunta

puede todos los si ... entonces ... else puede convertir en una declaración equivalente usando solamente:?

¿Fue útil?

Solución

Mientras que cualquier uso que se me ocurre para el operador ternario puede ser implementado como un if / else, lo contrario no es cierto; al menos no sin tener que recurrir a la perversa y 'trucos' sin sentido que producen ningún beneficio en términos de rendimiento, facilidad de lectura, o la capacidad de mantenimiento.

La sintaxis de if / else es:

if( <boolean expression> )
    <statment>|<statment block>
else
    <statment>|<statment block>

mientras que la sintaxis del operador?: Ternario es:

<boolean expression> ? <expression> : <expression> ;

Lo importante aquí siendo que un <expression> y una <statement> diferentes elementos sintácticos.

El uso muy limitada de la forma:

if( b ) x = y else x = z ;

puede ser implementado como:

x = b ? y : x ;

pero aquí la restricción es que la misma variable se asigna tanto en las cláusulas de verdaderas y falsas, (y por lo tanto Y y Z son ambos al menos convertible al tipo de x). Por lo tanto, se puede decir que cualquier asignación condicional pueden ser implementadas con el operador ternario (después de todo lo que es su objetivo principal).

Ahora bien, como una llamada de función es una expresión válida, que podría envolver las cláusulas de verdaderos y falsos en funciones separadas, pero para ello simplemente para demostrar un punto es un tanto perversa:

if( b )
    true_stuff() ;
else
    false_stuff() ;

es equivalente a:

b ? true_stuff() : false_stuff() ;

y esas funciones pueden contener cualquier código en absoluto.

Así que para convertir el caso más general if / else a una: el funcionamiento, los bloques de instrucciones de verdadero / falso primero deben ser envueltos en funciones separadas. Sin embargo, incluso entonces los ejemplos de Neil Butterworth DERROTARÁ este enfoque ya que el comportamiento de break, continue y return afectar el flujo de control más allá de los confines de la construcción if / else, (aunque tal vez esas son también ejemplos de código que quiere evitar!). La presencia de un goto en el enfoque if / else también iría en contra de esto. .

Creo que al final, incluso si se pudiera, ¿por qué querrías?

Otros consejos

El código:

if ( flag ) {
   exit(1);
}
else {
   return 0;
}

no se puede convertir en:

flag ? exit(1) : return 0;

Un mejor ejemplo - esto sería dentro de un bucle:

if ( flag ) {
   continue;
}
else {
   break;
}

no se puede convertir a:

flag ? continue : break;

No.

Los dos "ramas" de la expresión condicional debe evaluar al mismo tipo, y ese tipo no debe ser void.

Por ejemplo, usted puede hacer esto:

x > 0 ? printf("Positive!\n") : 0;

debido printf retorno int. (Sólo lo usaría esto en un partido de golf de código, aunque, de hecho, Sólo hice .)

Pero no se puede hacer esto:

x > 0 ? exit() : 0;

porque los rendimientos exit void (o, en realidad, no devuelve nada).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top