Principais operadores da linguagem C

            Uma das operações mais utilizadas em programação é a operação de atribuição =. Essa operação é responsável por armazenar determinado valor em uma variável. Em linguagem C, o uso do operador de atribuição segue a sintaxe nome_da_variável = expressão. Abaixo, um programa demonstrando o uso do operador de atribuição:

1    #include <stdio.h>
2
3    int main(void) {
4
5          int x = 10;
6          printf("x = %d\n", x);
7
8          return 0;
9
10    }

            Nós já executamos esse programa anteriormente e sabemos que o valor inteiro 10 está sendo atribuído à variável x, portanto, já estamos naturalizados com essa expressão. Sabemos também que podemos atribuir um valor à uma variável após sua definição, não necessariamente a inicializando, eis um exemplo:

1    #include <stdio.h>
2
3    int main(void) {
4
5          int x;
6          x = 10;
7          printf("x = %d\n", x);
8
9          return 0;
10
11    }

            x é inicializado com um lixo de memória, mas na linha seguinte atribuímos um valor à variável.

            É importante ter sempre em mente que o operador de atribuição calcula a expressão à direita do operador = e atribui esse valor à variável à esquerda do operador, nunca o contrário. Desse modo, podemos fazer as seguintes atribuições:

1    #include <stdio.h>
2
3    int main(void) {
4
5          int x, y, z;
6          x = y = z = 20;
7          printf("x = %d\ny = %d\nz = %d\n", x, y, z);
8
9          return 0;
10
11    }

            No código acima, o valor 20 é copiado para a variável z. Lembre-se: o valor da direita é sempre armazenado na variável especificada à sua esquerda. Em seguida, o valor de z é copiado para a variável y e, na sequência, o valor de y é copiado para x.

            Ao executar o programa, a saída que obtemos é a seguinte:

1ª imagem

            Os operadores aritméticos são aqueles que operam sobre números (valores, variáveis, constantes ou chamadas de funções) e/ou expressões e têm como resultado valores númericos. A linguagem C possui um total de cinco operadores aritméticos, como mostra a tabela a seguir:

Operador
Significado
Exemplo
-
adição de dois valores
z = x + y
-
subtração de dois valores
z = x - y
*
mutliplicação de dois valores
z = x * y
/
divisão de dois valores
z = x / y
%
resto de uma divisão
z = x % y

            Note que os operadores aritméticos são sempre usados em conjunto com o operador de atribuição. Afinal de contas, alguém precisa receber o resultado da expressão aritmética. Abaixo, um programa demonstrando o uso de cada um dos operadores aritméticos:

1    #include <stdio.h>
2
3    int main(void) {
4
5          int x = 10, y = 20, z, i, j, k, n;
6
7          z = x + y; // 30
8          i = z - x; // 20
9          j = i * 2; // 40
10        k = j / i; // 2
11        n = i % 2; // 0
12
13        printf("\nx = %d", x);
14        printf("\ny = %d", y);
15        printf("\nz = %d", z);
16        printf("\ni = %d", i);
17        printf("\nj = %d", j);
18        printf("\nk = %d", k);
19        printf("\nn = %d", n);
20        printf("\n%d + %d - 5 = %d\n", x, z, x + z - 5);
21
22        return 0;
23
24    }

            Note, no código acima, que podemos devolver o resultado de uma expressão aritmética para outra variável (linha 7 a 11) ou para outro comando ou função que espere receber um valor do mesmo tipo de resultado da operação, no caso, a função printf() (linha 20).

            Ao executar o programa, a saída que obtemos é a seguinte:

2ª imagem

Obs.: Em uma expressão, as operações de multiplicação, divisão e resto são executadas antes das operações de adição e subtração. Para forçar uma operação a ser executada antes das demais, ela é colocada entre parênteses. Considere a expressão:

z = x + * y + 10;

            Nela, o valor de x será multiplicado pelo valor de y, e o resultado dessa mutliplicação será somado ao valor 10 para só então ser atribuído à variável z. Se quiseremos a operação de adição antes da de multiplicação, basta colocá-la entre parênteses. Assim, na expressão

z = x + * (y + 10);

            o valor de y será somado ao valor 10, e o resultado dessa adição será multiplicado pelo valor de x para só então ser atribuído à variável x.

Obs.: O operador de resto da divisão só é válido para valores inteiros (tipo int e char).

            Os operadores relacionais são aqueles que operam sobre dois valores (valores, variáveis, constantes ou chamadas de funções) e/ou expressões e verificam a magnitude (qual é maior ou menor) e/ou igualdade entre eles. Basicamente, os operadores relacionais são operadores de comparação de valores. A linguagem C possui um total de seis operadores relacionais, como mostra a tabela a seguir:

Operador
Significado
Exemplo
>
maior que
x > 5
>=
maior ou igual a
x >= 10
<
menor que
x < 5
<=
menor ou igual a
x <= 10
==
igual a
x == 0
!=
diferente de
x != 0

            Como resultado, esse tipo de operador retorna:

            Um erro bastante comum quando se está programando em linguagem C é confundir o operador de atribuição = com o operador de atribuição ==. O operador de atribuição é definido por UM símbolo de igual (=), enquanto o operador de comparação é definido por DOIS símbolos de igual (==). Abaixo, um programa demonstrando o uso de cada um dos operadores relacionais:

1    #include <stdio.h>
2
3    int main(void) {
4
5          int x = 10, y = 5;
6
7          printf("Resultado: %d\n", x > 10); // falso (0)
8          printf("Resultado: %d\n", x >= 10); // verdadeiro (1)
9          printf("Resultado: %d\n", y < x); // verdadeiro (1)
10        printf("Resultado: %d\n", y <= 2); // falso (0)
11        printf("Resultado: %d\n", x == y); // falso (0)
12        printf("Resultado: %d\n", y != 10); // verdadeiro (1)
13
14        return 0;
15
16    }

            Ao executar o programa, a saída que obtemos é a seguinte:

3ª imagem

            Certas situações não podem ser modeladas apenas utilizando os operadores aritméticos e/ou relacionais. Um exemplo bastante simples disso é saber se determinada variável x está dentro de uma faixa de valores. Por exemplo, a expressão aritmética

0 < x < 10

            indica que o valor de x deve ser maior do que 0 (zero) e também menor que 10. Para modelar esse tipo de situação, a linguagem C possui um conjunto de três operadores lógicos, como mostra a tabela a seguir:

Operador
Significado
Exemplo
&&
operador E
(x >= 0 && x <= 9)
||
operador OU
(a == 'F' || b != 32)
!=
operador NEGAÇÃO
!(x == 10)

            Esse operadores permitem representar situações lógicas unindo duas ou mais expressões relacionais simples em uma composta:

            Os operadores lógicos atuam sobre valores lógicos e retornam um valor lógico:

            Abaixo, um programa demonstrando o uso de cada um dos operadores lógicos:

1    #include <stdio.h>
2
3    int main(void) {
4
5          int r, x = 5, y = 3;
6
7          r = (x > 2) && (y < x); // verdadeiro (0)
8          printf("\nResultado: %d\n", r);
9
10        r = (x % 2 == 0) && (y > 0); // falso (0)
11        printf("Resultado: %d\n", r);
12
13        r = (x > 2) || (y > x); // verdadeiro (0)
14        printf("Resultado: %d\n", r);
15
16        r = (x % 2 == 0) || (y < 0); // falso (0)
17        printf("Resultado: %d\n", r);
18
19        r = !(x > 2); // falso (0)
20        printf("Resultado: %d\n", r);
21
22        r = !(x > 7) && (x > y); // verdadeiro (1)
23        printf("Resultado: %d\n", r);
24
25        return 0;
26
27    }

            Ao executar o programa, a saída que obtemos é a seguinte:

4ª imagem

            A tabela a seguir apresenta a tabela-verdade, em que os termos a e b representam o resultado de duas expressões relacionais:

Tabela-verdade
a
b
!a
!b
a && b
a || b
0
0
1
1
0
0
0
1
1
0
0
1
1
0
0
1
0
1
1
1
0
0
1
1

            A linguagem C também possui operadores de incremento (++) e decremento (--). Esses operadores podem ser utilizados sempre que for necessário somar uma unidade (incremento) ou subtrair uma unidade (decremento) a determinado valor, como mostra a seguinte tabela:

Operador
Significado
Exemplo
Resultado
++
incremento
++x ou x++
x = x + 1
--
decremento
--x ou x--
x = x - 1

            Tanto o operador de incremento (++) quanto o de decremento (--) possuem embutida uma operação de atribuição. Note, no entanto, que esse operador pode ser usado antes ou depois do nome da variável, com uma diferença significativa:

            Essa diferença na sintaxe não tem importância se o operador for utilizado sozinho, como demonstram os programas abaixos:

1    #include <stdio.h>
2
3    int main(void) {
4
5          int x = 10;
6          ++x;
7          printf("x = %d\n", x);
8
9          return 0;
10
11    }

1    #include <stdio.h>
2
3    int main(void) {
4
5          int x = 10;
6          x++;
7          printf("x = %d\n", x);
8
9          return 0;
10
11    }

            Ao executar os programas, as saídas que obtemos são as seguintes:

5ª imagem 6ª imagem

            Porém, se esse operador for utilizado dentro de uma expressão aritmética, a diferença entre os dois operadores será evidente. Comecemos pelo operador de pré-incremento:

1    #include <stdio.h>
2
3    int main(void) {
4
5          int y, x = 10;
6
7          // incrementa, depois atribui
8          y = ++x;
9
10        printf("x = %d\n", x);
11        printf("y = %d\n", y);
12
13        return 0;
14
15    }

            Ao executar o programa, a saída que obtemos é a seguinte:

7ª imagem

            Como se pode ver, o operador de pré-incremento (++x) é a primeira coisa a ser realizada dentro da expressão. Somente depois de incrementado o valor de x é que ele é atribuído à variável y. Nota-se, nesse caso, que a expressão

y = ++x;

            é equivalente a

x = x + 1;
y = x;

            Abaixo, o mesmo programa, agora utilizando o operador de pós-incremento:

1    #include <stdio.h>
2
3    int main(void) {
4
5          int y, x = 10;
6
7          // atribui, depois incrementa
8          y = x++;
9
10        printf("x = %d\n", x);
11        printf("y = %d\n", y);
12
13        return 0;
14
15    }

            Ao executar o programa, a saída que obtemos é a seguinte:

8ª imagem

            Nesse segundo exemplo, o operador de pós-incremento (x++) é a última coisa a ser realizada dentro da expressão. Primeiro atribui-se o valor de x à variável y, para somente depois incrementar a variável x. Nota-se, nesse caso, que a expressão

y = x++;

            é equivalente a

y = x;
x = x + 1;

            Como podemos ver, a linguagem C contém muitos operadores. Consequentemente, o uso de múltiplos operadores em uma única expressão pode tornar confusa a sua interpretação. Por esse motivo, a linguagem C possui uma série de regras de precedência de operadores. Isso permite que o compilador possa decidir corretamente qual a ordem em que os operadores deverão ser executados em uma expressão contendo vários. As regras de precedência seguem basicamente as regras da matemática, pelas quais a multiplicação e a divisão são executadas antes da soma e da subtração. Além disso, podem-se utilizar parênteses para forçar o compilador a executar uma parte da expressão antes das demais.

            A seguir, uma lista ordenada que mostra as regras de precedência dos principais operadores presentes na linguagem C. Quanto menor o número, maior o nível de precedência (prioridade) dos operadores em questão. Na primeira posição da lista são apresentados os opeadores executados em primeiro lugar, enquanto a última posição da lista mostra os operadores executados por último em uma expressão:

  1. ++ -- Pré-incremento/decremento
  2. () Parênteses (chamada de função)
  3. [] Elemento de array
  4. . Elemento de struct
  5. -> Conteúdo de elemento de ponteiro para struct
  6. ++ -- Pós-incremento/decremento
  7. + - Adição e subtração unária
  8. !~ Não lógico e complemento bit a bit
  9. (tipo) Conversão de tipos (type cast)
  10. * Acesso ao conteúdo de ponteiro
  11. & Endereço de memória do elemento
  12. sizeof Tamanho do elemento
  13. * / % Mutliplicação, divisão e módulo (resto)
  14. + - Adição e subtração
  15. << >> Deslocamento de bits à esquerda e à direita
  16. < <= "Menor do que" e "menor ou igual a"
  17. > >= "Maior do que" e "maior ou igual a"
  18. == != "Igual a" e "diferente de"
  19. & E bit a bit
  20. ^ OU exclusivo
  21. | OU bit a bit
  22. && E lógico
  23. || OU lógico
  24. ?: Operador ternário
  25. = Atribuição
  26. += -= Atribuição por adição ou subtração
  27. *= /= %= Atribuição por multiplicação, divisão ou módulo (resto)
  28. <<= >>= Atribuição por deslocamento de bits
  29. &= ^= |= Atribuição por operações lógicas
  30. , vírgula
Obs.: É possível notar que a maioria dos operadores não foram citados nessa página, pois o objetivo desse tutorial é listar apenas o componentes básicos da linguagem C e, no caso dos operadores, os principais e mais utilizados.

Página anterior

Próxima página