====== 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