Operadores de igualdade, lógicos, e relacionais
Operadores de igualdade
Os operadores de igualdade verificam a equivalência entre os valores de dois objetos.
Operadores == e !=
O operador == ("igual a") produz o valor 1 (true) quando seus operandos
possuem valores equivalentes. A expressão 5 == 5 tem valor 1, enquanto a
expressão 5 == 6 tem valor 0 (false).
O operador != ("não igual a") é o oposto de ==. Quando ambos os operandos
possuem valores equivalentes a expressão tem valor 0, caso contrário 1.
7 != 9 resulta em 1, e 7 != 7 resulta em 0.
Imaginemos a expressão A <op> B, sendo <op> um dos operadores == ou
!=.
| A | op | B | Resultado |
|---|---|---|---|
| 10 | == | 10 | true |
| 10 | != | 10 | false |
| 10 | == | 25 | false |
| 10 | != | 25 | true |
Se A == B for true, A != B é necessariamente false.
Operadores relacionais
Operadores < e >
O operador < ("menor que") produz o valor 1 quando o valor do operando à
esquerda for menor que o valor à direita, e o operador > ("maior que")
produz o valor 1 quando o valor do operando à esquerda for maior que o
valor à direita. Nos demais casos, o resultado é 0.
Imaginemos a expressão A <op> B, sendo <op> um dos operadores < ou
>.
| A | op | B | Resultado |
|---|---|---|---|
| 0 | < | 15 | true |
| 0 | > | 15 | false |
| 15 | < | 15 | false |
| 15 | > | 15 | false |
| 15 | < | 0 | false |
| 15 | > | 0 | true |
Se ambos A > B e A < B forem false, então A == B é true e vice-versa.
A afirmação anterior não se aplica caso pelo menos uma das expressões isnan(A)
e isnan(B) (de <math.h>) for diferente de false. Um objeto de tipo
flutuante pode possuir um valor NaN, que representa um número indefinido ou
irrepresentável.
Operadores <= e >=
Os operadores <= ("menor que ou igual a") e >= ("maior que ou igual a") são
similares aos operadores acima. A <= B é true quando A for menor ou
igual a B, e A >= B é true quando A for maior ou igual a B.
É possível que tanto A <= B quanto A >= B sejam true, nesse caso A e B
possuem valores equivalentes.
Operadores lógicos
Para todos os fins relacionados aos operadores lógicos, qualquer valor diferente
de 0 (false) é considerado true.
Operador !
O operador ! ("NÃO lógico") inverte o valor lógico de uma expressão—true se
torna false e false se torna true.
Se a expressão <expr> for true, a expressão !(<expr>) é necessariamente
false. ! tem precedência maior que todos os operadores apresentados nessa
página.
Operadores && e ||
Os operadores && ("E lógico") e || ("OU lógico") são simples. O resultado da
aplicação de && é true quando ambos os operandos possuem valor true,
enquanto || produz true quando pelo menos um de seus operandos possuir
valor true.
| A | op | B | Resultado |
|---|---|---|---|
false | || | false | false |
false | && | false | false |
true | || | false | true |
true | && | false | false |
true | || | true | true |
true | && | true | true |
Assim, podemos utilizar várias expressões para produzir um valor lógico. Por
exemplo: a < b && b < c só é true se a, b e c cada um possuir um valor
maior que o anterior. A precedência dos operadores lógicos E e OU é menor do que
a dos operadores relacionais, portanto a expressão anterior é equivalente a
(a < b) && (b < c).
A precedência do operador || é menor do que a de &&, portanto
a || b || c && d || e é equivalente a a || b || (c && d) || e.
Vamos utilizar os operadores que vimos para fazer uma função que verifica se vários números estão ordenados—cada número na sequência é maior ou equivalente ao anterior.
bool Ordenados(int a, int b, int c, int d, int e)
{
return a <= b && b <= c && c <= d && d <= e;
}
A função Ordenados retorna true com os argumentos 1, 2, 3, 4, 5, mas
retorna false com os argumentos 1, 2, 3, 4, 3. Vamos utilizá-la em um
programa interativo:
int main(void)
{
int a, b, c, d, e;
printf("Digite 5 inteiros separados por vírgula: ");
scanf("%d ,%d ,%d ,%d ,%d",
&a, &b, &c, &d, &e);
// Isso exibirá "1" (true) ou "0" (false)
printf("Os números estão ordenados? %d\n",
Ordenados(a, b, c, d, e));
}
O posicionamento das vírgulas no scanf acima pode ser contraintuitivo, mas
lembre-se de um detalhe que vimos sobre a string de formato: um espaço em branco
faz o scanf pular zero ou mais caracteres white-space na leitura, portanto
ele funciona corretamente até se a vírgula estiver logo após o número. A
especificação %d também pula caracteres white-space caso existam, assim até a
entrada 1 , 2,3, 4, 5 funcionaria corretamente.
Valores bool se tornam int ao serem passados para printf, por isso a
especificação %d funciona corretamente.
Associatividade
Os operadores de igualdade, lógicos, e relacionais são associativos-à-esquerda,
exceto o operador !.