Operador condicional em C
-
24-09-2019 - |
Pergunta
Todo se ... então ... else a declaração pode ser convertida em uma declaração equivalente usando apenas?:
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).