int f( bool a, int b, int c, int d )
{
if( b > c && a == false )
return 1 ;
else if( c < d && a == false )
return 2 ;
else if( a == true )
return 3 ;
else
return 4 ;
}
Olhem para ele e digam o que está errado, o que pode ser melhorado. Depois de pensar nele, cliquem em "Mais informações" para ver o resto da discussão.
Primeiro, tipo booleano, em qualquer linguagem de programação que eu conheço, não precisa ser comparado com true ou false.
int f( bool a, int b, int c, int d )
{
if( b > c && !a )
return 1 ;
else if( c < d && !a )
return 2 ;
else if( a )
return 3 ;
else
return 4 ;
}
Bons compiladores resolvem isto na boa, mas é meio deselegante fazer as comparações. Elas fogem do propósito.
Mas ainda tem algo mais estranho ainda. Observe o terceiro if. Se mudarmos a ordem simplifica os testes dos dois primeiros if's.
int f( bool a, int b, int c, int d )
{
if( a )
return 3 ;
else if( b > c )
return 1 ;
else if( c < d )
return 2 ;
else
return 4 ;
}
Agora sempre que a variável a for true o resultado logo estará determinado, e não será mais necessário testar esta variável.
Mas em todas as situações temos um return. Então o else se torna redundante. O código abaixo tecnicamente é equivalente com o de cima.
int f( bool a, int b, int c, int d )
{
if( a )
return 3 ;
if( b > c )
return 1 ;
if( c < d )
return 2 ;
return 4 ;
}
Então fique atento com as sequências de if's.
O Fernando Ferreira no Facebook propôs a seguinte solução, que é baseada na minha penúltima solução.
ResponderExcluirreturn a ? 3 : ((b > c ? 1 : (c > d ? 2 : 4)));
A solução dele é bem compacta de escrever, e pode basicamente o mesmo código, ou um radicalmente diferente usando uma variável temporária.