Podem ser unários (1 operando) binários (2 operandos) ou ternários (3 operandos) e também pré fixados (operador antes do operando), infixados (operador entre os operandos) ou pós fixados (operador após o operando). Tabela de Operadores
PRIORIDADE - Se dá de baixo para cima nos operadores da tabela. Define a precedência de execução. Numa expressão com várias operações qual será executada primeiro? Ex: x += y++; Qual operação será executada primeiro? += ou ++? A operação y++ será executada primeiro pois o operador ++ tem maior prioridade. ASSOCIATIVIDADE - Define o sentido da execução. Entre duas operações com a mesma prioridade qual será executada primeiro? Ex: x = y = 10; Qual operação será executada primeiro? x = y ou y = 10? A prioridade é a mesma, mas como a associatividade do operador = é da direita para a esquerda, será executada primeiro y = 10. 1 - Pré-processamento # #include -> para a inclusão de arquivos texto no programa fonte. É normalmente utilizado para efetuar a inclusão dos arquivos de header das bibliotecas utilizadas. Ao fazermos por exemplo #include < stdio.h >, estamos incluindo em nosso programa fonte o texto contido no arquivo stdio.h, que são as declarações das funções contidas na biblioteca stdio. #define -> para definição de macros e constantes simbólicas (já explicado no item Declaração de variáveis deste tutorial). No caso da macro #define soma (a+b) é definida uma ação e não um valor. 2 - Atribuição = Na linguagem C, a operação de atribuição tem como retorno o valor atribuído, portanto podemos ter várias atribuições em uma mesma expressão (associatividade). Ex: x = y = z = 10 3 - Aritméticos 3.1) Tradicionais + soma - subtração * multiplicação / divisão % resto da divisão OBS: Na linguagem C, o operador de divisão (/) pode receber tanto operandos inteiros como reais. Quando os dois operandos são inteiros, é obtido um resultado inteiro (número truncado), quando pelo menos um dos operandos é real, o resultado obtido é real. 3.2) De atribuição += -= *= /= %= Funcionam como a operação aritmética mais a operação de atribuição. Ex: x += y equivale a x = x+y. 3.3) Incremento e Decremento ++ -- Pré-fixados: ++x => Primeiro é realizado o incremento de x e depois é retornado seu valor. Pós-fixados: x++ => Primeiro é retornado o valor de x e depois é realizado seu incremento. 4 - Relacionais == igual != diferente < menor <= menor ou igual > maior >= maior ou igual Como não existem valores lógicos (booleanos) as operações relacionais, retornam o valor 0 para falso e 1 para verdadeiro. 5 - Lógicos && E (AND) || OU (OR) < menor ! NÃO (NOT) 6 - Condicional ?: Operador ternário. É uma forma compactada de se definir uma instrução de seleção simples. Forma geral: < expressão_1 > ? < expressão_2 > : < expressão_3 > É executada a expressão_1. Se o resultado for verdadeiro, é executada a expressão_2. Se for falso é executada a expressão 3. O resultado da expressão executada é retornado coo sendo o resultado do condicional. Ex: x = ( y > 3 ? y - 2 : y + 5 ); Se y > 3 então a expressão y - 2 é executada e seu valor é retornado para x, caso contrário a expressão y + 5 é executada e seu valor é retornado. 7 - Chamada de função () Qualquer chamada de função necessita dos parênteses (passando os parâmetros quando a função os tiver, ou vazios quando a função for void). Ex: media(a,b); imp_dados(); 8 - Subscrito [] Utilizado para declarar e indexar um vetor. Ex: int vet [5]; vet [2] = 7; 9 - Seletor de componente direto Utilizado para acessar um elemento de um registro. < nome_var_registro >.< nome_elemento > Ex: struct empregado {int matricula; float salário; char nome[30];}emp1; emp1.matricula = 111; 10 - De endereço & Retorna o endereço da variável, ou seja, o endereço do primeiro byte que ela ocupa na memória. É um operador pré-fixado. Ex: &x retorna o endereço da variável x 11 - Modelo de tipo (tipo) Pré-fixado. Possibilita que o valor encontrado logo após ele seja utilizado como se fosse daquele tipo. Ex: int y = f; float x; x = (float) y/2; Considera a variável y como do tipo real (5.0) apenas nesta linha de comando, fazendo então com que a opeação de divisão retorne um valor real. 12 - Sizeof Retorna o tamanho (número de bytes) que um tipo de dado ou variável ocupa na memória. sizeof(< nome da variável ou tipo >); Ex: sizeof(int) retorna o valor 2 (2 bytes) 13 - Manipulação de ponteiros * O mesmo operador possui 2 finalidades diferentes: - Declaração de variáveis ponteiro < tipo_da_variavel_apontada > * < nome_ponteiro > Ex: int * p; declaração de uma variável p do ripo ponteiro para inteiro. - Indireção - Acesso ao conteúdo da variável apontada * < nome_ponteiro > Ex: printf("%d", *p); -> imprime o conteúdo da variável apontada por p. 14 - Manipulação bit a bit Possibilitam a manipulação de valores em suas representações binárias, bit a bit. 14.1) Deslocamento à direita >> Desloca um determinado número de bits para a direita, completando com zeros a equerda. 14.2) Deslocamento à esquerda << Desloca um determinado número de bits para a esquerda, completando com zeros a direita. 14.3) Complemento de 1 ~ Troca cada dígito binário, transformando o 1 em 0 e o 0 em 1. 14.4) E lógico bit a bit & Compara dois valores bit a bit. O resultado tem 1 se naquela posição os dois bits comparados forem 1. 14.5) OR inclusivo bit a bit | Compara dois valores bit a bit. O resultado tem 1 se naquela posição se houver alhum valor 1. 14.6) OR exclusivo bit a bit ^ Compara dois valores bit a bit. O resultado tem 1 em cada posição onde os bits comparados forem diferentes, e 0 quando forem iguais. |