Um operador é um símbolo que indica a realização de uma operação sobre uma ou mais variáveis ou valores. Há uma grande diversidade de operadores em C, sendo os principais apresentados nesta seção.
Os principais operadores aritméticos são descritos abaixo, considerando A = 10
e B = 20
:
Operador | Descrição | Exemplo | Resultado |
---|---|---|---|
+ | soma | A + B | 30 |
- | subtração | A - B | -10 |
* | multiplicação | A * B | 200 |
/ | divisão | B / A | 2 |
% | resto da divisão inteira | B % A | 0 |
++ | incrementa variável | A++ | A vale 11 |
-- | decrementa variável | A-- | A vale 9 |
Operador | Descrição | Exemplo | Resultado |
---|---|---|---|
== | igual | A == B | falso |
!= | diferente | A != B | verdade |
> | maior | A > B | falso |
< | menor | A < B | verdade |
>= | maior ou igual | A >= B | falso |
<= | menor ou igual | A <= B | verdade |
Operador | Descrição | Exemplo |
---|---|---|
&& | AND lógico | A && B |
|| | OR lógico | A || B |
! | NOT lógico | !A |
Operador | Descrição | Exemplo | Equivale a |
---|---|---|---|
= | atribuição simples de valor a variável | A = B + 17 | |
+= | atribuição com soma | A += 3 | A = A + 3 |
-= | atribuição com subtração | A -= B - 7 | A = A - (B - 7) |
*= | atribuição com produto | C *= A | C = C * A |
/= | atribuição com divisão | C /= A | C = C / A |
%= | atribuição com módulo | C %= A | C = C % A |
=
) com o teste de igualdade ( ==
). Por exemplo, a expressão if (x = 3)
será sempre verdade, independente do valor de x
.
Considerando duas variáveis inteiras de 8 bits sem sinal:
Operador | Descrição | Exemplo | Resultado |
---|---|---|---|
& | AND bit-a-bit | A & B | 0000 0001 (1) |
| | OR binário | A | B | 0111 0011 (115) |
^ | XOR binário | A ^ B | 0111 0010 (114) |
~ | complemento de 1 | ~A | 1110 1110 (238) |
<< | desloca à esquerda N bits | A << 2 | 0100 0100 (68) |
>> | desloca à direita N bits | A >> 2 | 0000 0100 (4) |
&= | atribuição com AND binário | C &= 2 | C = C & 2 |
|= | atribuição com OR binário | C |= 2 | C = C | 2 |
^= | atribuição com XOR binário | C ^= 2 | C = C ^ 2 |
<<= | atribuição com deslocamento à esquerda | C <<= 2 | C = C << 2 |
>>= | atribuição com deslocamento à direita | C >>= 2 | C = C >> 2 |
Operador | Descrição | Exemplo |
---|---|---|
sizeof() | tamanho da variável em bytes | sizeof(A) |
& | endereço de variável | &A |
* | ponteiro para uma posição de memória | *x |
? : | condicional ternária: if X then Y else Z | X ? Y : Z |
A ordem de precedência dos operadores vistos acima define a sequência em que os operadores serão aplicados. A ordem de precedência pode ter forte influência sobre o resultado da avaliação de expressões complexas.
A tabela a seguir indica a ordem de precedência dos principais operadores em C, da maior para a menor:
Ordem | Operadores | Descrição |
---|---|---|
1 | () [] . -> | chamadas de função, escopos, acesso a vetores e estruturas |
2 | ! ~ - + * & sizeof type cast ++ -- | operadores unários |
3 | * / % | multiplicação, divisão, módulo |
4 | + - | adição, subtração |
5 | << >> | deslocamentos binários |
6 | < <= > >= | relacionais |
7 | == != | relacionais |
8 | & | AND binário |
9 | ^ | XOR binário |
10 | | | OR binário |
11 | && | AND lógico |
12 | || | OR lógico |
13 | ? : | expressão condicional ternária |
14 | = += -= *= /= %= &= |= ^= <<= >>= | atribuições |
15 | , | sequência (operador “vírgula”) |
O tipo do resultado de uma expressão numérica depende dos valores e variáveis envolvidos. Por exemplo, uma expressão contendo somente tipos int
terá um resultado inteiro. Como regra geral, o tipo do resultado de uma expressão será o tipo mais forte presente na expressão, onde a “força” dos tipos numéricos é definida como:
int
< unsigned int
< long
< unsigned long
< float
< double
< long double
Elementos de tipos short
e char
em expressões numéricas são avaliados como int
.
Essa regra de avaliação pode induzir a erros:
// Cálculo da média simples de dois valores #include <stdio.h> int main () { int a = 2, b = 5; float media; media = (a + b) / 2; printf("a media de %d e %d vale %f\n", a, b, media) ; return (0) ; }
No código acima, a expressão (a + b) / 2
somente envolve inteiros, por isso sua avaliação irá gerar um resultado inteiro, independente do tipo da variável media
(a atribuição é o último operador avaliado):
a media de 2 e 5 vale 3.000000 // erro!
Para forçar a avaliação da expressão com reais, basta incluir um valor real:
media = (a + b) / 2.0 ;
Agora temos o resultado correto:
a media de 2 e 5 vale 3.500000