Operador condicional: Difference between revisions
(Antes eu disse que era mais fácil ter o operador condicional do que dois comandos, if e else. Pode ser um equívoco porque na prática você troca duas palavras chave por dois caracteres. Então podia ser um erro falar em um comando contra dois comandos.) Tag: wikieditor |
No edit summary Tag: wikieditor |
||
Line 11: | Line 11: | ||
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. | 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:''' | |||
<source lang="c"> | |||
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); | |||
</source> | |||
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:''' | |||
<source lang="c"> | |||
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); | |||
</source> | |||
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. |
Latest revision as of 20:14, 20 January 2025
- 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.