Operadores


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

Operador(es) Associatividade
() {} -> ponto --------->
! ++ -- + - * & (tipo) sizeof <---------
* / % --------->
+ - --------->
>> << --------->
> >= < <= --------->
== != --------->
&& --------->
|| --------->
?: <---------
= += -= *= /= %= <---------


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.