====== Operadores em C ======
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.
===== Operadores aritméticos =====
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 |
===== Operadores relacionais =====
^ 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 |
===== Operadores lógicos =====
^ Operador ^ Descrição ^ Exemplo ^
| ''&&'' | AND lógico | ''A && B'' |
| ''%%||%%'' | OR lógico | ''A %%||%% B'' |
| ''!'' | NOT lógico | ''!A'' |
===== Operadores de atribuição =====
^ 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'' |
Muito cuidado para não confundir a atribuição ( ''='' ) com o teste de igualdade ( ''=='' ). Por exemplo, a expressão ''if (x = 3)'' será **sempre verdade**, independente do valor de ''x''.
===== Operadores binários =====
Considerando duas variáveis inteiras de 8 bits sem sinal:
* A = 0001 0001 (17)
* B = 0110 0011 (99)
^ 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'' |
===== Operadores diversos =====
^ 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'' |
===== Ordem de precedência =====
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") |
===== Avaliação de expressões =====
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
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