Pergunta

Todo se ... então ... else a declaração pode ser convertida em uma declaração equivalente usando apenas?:

Foi útil?

Solução

Embora qualquer uso que eu possa imaginar para o operador ternário possa ser implementado como um if/else, o inverso não é verdadeiro; Pelo menos não sem recorrer a 'truques' perversos e inúteis que não produzem benefícios em termos de desempenho, legibilidade ou manutenção.

A sintaxe de if/else é:

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

Considerando que a sintaxe da ?: O operador ternário é:

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

O importante aqui é que um <expression> e a <statement> são elementos sintáticos diferentes.

O uso muito limitado do formulário:

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

pode ser implementado como:

x = b ? y : x ;

Mas aqui a restrição é que a mesma variável está sendo atribuída nas cláusulas verdadeiras e falsas, (e, portanto, Y e Z são pelo menos conversíveis ao tipo de x). Portanto, pode -se dizer que qualquer atribuição condicional pode ser implementado com o operador ternário (depois de tudo o que é seu principal objetivo).

Agora, como uma chamada de função é uma expressão válida, você pode envolver as cláusulas verdadeiras e falsas em funções separadas, mas fazer isso simplesmente para provar que um ponto é um pouco perverso:

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

é equivalente a:

b ? true_stuff() : false_stuff() ;

E essas funções podem conter qualquer código.

Portanto, para converter o caso mais geral se/else para a?: Operação, os blocos de instrução verdadeiros/falsos devem primeiro ser envolvidos em funções separadas. No entanto, mesmo assim, os exemplos de Neil Butterworth derrotarão essa abordagem, pois o comportamento de break, continue, e return afetar o fluxo de controle além dos limites da construção if/else (embora talvez esses também sejam exemplos de código que você deseja evitar!). A presença de um goto no IF/else também derrotaria essa abordagem. .

Eu acho que no final, mesmo que você pudesse, por que você gostaria?

Outras dicas

O código:

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

não pode ser convertido em:

flag ? exit(1) : return 0;

Um exemplo melhor - isso estaria dentro de um loop:

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

não pode ser convertido para:

flag ? continue : break;

Não.

Ambos os "ramos" da expressão condicional devem avaliar o mesmo tipo, e esse tipo não deve ser void.

Por exemplo, você pode fazer isso:

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

Porque printf Retorna int. (Eu só usaria isso em uma rodada de golfe de código; de fato, eu apenas fiz.)

Mas você não pode fazer isso:

x > 0 ? exit() : 0;

Porque exit retorna void (ou, na verdade, não retorna).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top