Operador condicional
- O mesmo algoritmo que testa se um número é par ou ímpar, agora com o operador '?:' (operador ternário ou condicional):
int a; a % 2 == 0 ? printf("o numero %d e par", a) : printf("o numero %d e impar", a);
O operador ?: simplifica a declaração if else numa única linha de código. Fica mais prático digitar uma interrogação e dois pontos. Há duas diferenças entre usar if else e o operador condicional: legibilidade e depuração. Para o primeiro, uma única linha de código é mais próxima da linguagem natural. Para o segundo, pode ser necessário a declaração if else para fins de depuração do fluxo do programa.
Há, no entanto, um empecilho: quando uma expressão condicional é formada a partir de uma pergunta e existe um número finito de respostas possíveis (perguntas sem resposta não contam), então é possível escrever a mesma coisa usando um operador condicional. Porém, se o par if else for usado para controlar o fluxo do programa. Como por exemplo quebrar um laço, então não há uma expressão correspondente com o uso do operador condicional. Isto advém de uma diferença muito sutil: expressões são algo para ser avaliado (toda a linha de código escrita com o operador condicional é considerada uma expressão). Há um resultado associado a elas, enquanto instruções não incorrem numa avaliação per se. Variáveis podem ser declaradas e instruções como 'break' e 'return' podem ser usadas dentro de blocos if else, mas não dentro de expressões condicionais. Por outro lado, o operador condicional pode ser usado dentro de um if else e até mesmo ser a própria expressão condicional de uma instrução 'if'.
Um outro caso onde if else não pode ser traduzido diretamente para uma expressão com operador condicional: há casos em que existe uma sentença do tipo 'if' sem um 'else', ou mais de um 'if' e todos eles podem ser simultaneamente verdadeiros. Num caso assim a expressão que efetivamente preenche o espaço que seria preenchido pelo 'else' é qualquer expressão sem efeito como a = a
. Adicionar uma expressão sem efeito no espaço do 'else' faltante quando o operador condicional é usado é um desperdício de processamento.
Em termos de desempenho, o operador condicional pode ser ou pode não ser idêntico ao if else. O código de baixo nível precisaria ser verificado para checar se existem diferenças entre um e outro. Mas, para este nível introdutório, a performance não importa.
- Uma variação simples do algoritmo acima:
int a, b; b = (a % 2 == 0) ? 1 : 0; b == 1 ? printf("o numero %d e par", a) : printf("o numero %d e impar", a);
Isto é o mesmo que usar dois pares de instruções if else, uma depois da outra. O primeiro testa se 'a' é par ou ímpar e guarda a "resposta" em 'b'. Em seguida o segundo imprime a mensagem. Casos de ifs encaixados como no exemplo de cima com a soma e multiplicação de números pares e ímpares também podem ser reescritos com o operador condicional, mas aí fica mais difícil de ler o código e mais fácil de errar.
- Instruções if ... else if ... else também podem ser reescritas com o operador condicional:
int a; (a > 0) ? printf("numero %d e positivo", a) : (a < 0) ? printf("numero %d e negativo", a) : printf("numero %d nao e positivo e nem negativo", a);
Perceba que o sinal ':' aparece duas vezes. A primeira para o primeiro 'if', a segunda para separar o else if (à esquerda) do 'else' (à direita).
A principal desvantagem do operador condicional para construções com if else encaixados é que pode ficar mais difícil de ler o código.