Pular para conteúdo

Operadores

O Portugol-C oferece um conjunto completo de operadores para realizar operações aritméticas, relacionais, lógicas e de atribuição, permitindo a construção de expressões complexas.

Operadores Aritméticos

Operadores Básicos

Operador Descrição Exemplo Resultado
+ Adição 5 + 3 8
- Subtração 10 - 4 6
* Multiplicação 6 * 7 42
/ Divisão 15 / 3 5
% Módulo (resto da divisão) 17 % 5 2

Exemplos de Uso

programa {
    funcao inicio() {
        inteiro a = 15, b = 4;
        real x = 10.5, y = 3.2;

        // Operações com inteiros
        escreva("Soma: ", a + b, "\n");           // 19
        escreva("Subtração: ", a - b, "\n");      // 11
        escreva("Multiplicação: ", a * b, "\n");  // 60
        escreva("Divisão: ", a / b, "\n");        // 3 (divisão inteira)
        escreva("Módulo: ", a % b, "\n");         // 3

        // Operações com reais
        escreva("Soma real: ", x + y, "\n");      // 13.7
        escreva("Divisão real: ", x / y, "\n");   // 3.28125

        // Operações mistas
        escreva("Mista: ", a + x, "\n");          // 25.5
    }
}

Operador Unário

programa {
    funcao inicio() {
        inteiro numero = 10;

        escreva("Número original: ", numero, "\n");     // 10
        escreva("Número negativo: ", -numero, "\n");    // -10
        escreva("Positivo explícito: ", +numero, "\n"); // 10
    }
}

Operadores de Atribuição

Atribuição Simples

inteiro x = 10;        // Atribuição inicial
x = 20;                // Reatribuição

Operadores de Atribuição Composta

Operador Equivalente Exemplo Significado
+= x = x + y x += 5 Adicionar e atribuir
-= x = x - y x -= 3 Subtrair e atribuir
*= x = x * y x *= 2 Multiplicar e atribuir
/= x = x / y x /= 4 Dividir e atribuir
%= x = x % y x %= 3 Módulo e atribuir
programa {
    funcao inicio() {
        inteiro valor = 10;

        escreva("Valor inicial: ", valor, "\n");  // 10

        valor += 5;
        escreva("Após += 5: ", valor, "\n");      // 15

        valor -= 3;
        escreva("Após -= 3: ", valor, "\n");      // 12

        valor *= 2;
        escreva("Após *= 2: ", valor, "\n");      // 24

        valor /= 4;
        escreva("Após /= 4: ", valor, "\n");      // 6

        valor %= 4;
        escreva("Após %= 4: ", valor, "\n");      // 2
    }
}

Operadores de Incremento e Decremento

Pré e Pós-incremento/decremento

Operador Descrição Exemplo Comportamento
++x Pré-incremento ++contador Incrementa primeiro, depois usa
x++ Pós-incremento contador++ Usa primeiro, depois incrementa
--x Pré-decremento --contador Decrementa primeiro, depois usa
x-- Pós-decremento contador-- Usa primeiro, depois decrementa
programa {
    funcao inicio() {
        inteiro a = 5, b = 5;

        escreva("Valores iniciais - a: ", a, ", b: ", b, "\n");

        // Pré-incremento
        escreva("Pré-incremento ++a: ", ++a, "\n");  // a vira 6, mostra 6
        escreva("Valor de a agora: ", a, "\n");      // 6

        // Pós-incremento
        escreva("Pós-incremento b++: ", b++, "\n");  // mostra 5, b vira 6
        escreva("Valor de b agora: ", b, "\n");      // 6

        // Uso em loops
        para (inteiro i = 0; i < 3; i++) {
            escreva("Loop: ", i, "\n");
        }

        // Decremento
        inteiro c = 10;
        escreva("Pré-decremento --c: ", --c, "\n");  // 9
        escreva("Pós-decremento c--: ", c--, "\n");  // 9, depois vira 8
        escreva("Valor final de c: ", c, "\n");      // 8
    }
}

Operadores Relacionais

Comparações

Operador Descrição Exemplo Resultado
== Igual a 5 == 5 verdadeiro
!= Diferente de 5 != 3 verdadeiro
< Menor que 3 < 5 verdadeiro
> Maior que 7 > 4 verdadeiro
<= Menor ou igual 5 <= 5 verdadeiro
>= Maior ou igual 6 >= 6 verdadeiro
programa {
    funcao inicio() {
        inteiro x = 10, y = 20;

        escreva("x = ", x, ", y = ", y, "\n");

        escreva("x == y: ", (x == y), "\n");     // falso (0)
        escreva("x != y: ", (x != y), "\n");     // verdadeiro (1)
        escreva("x < y: ", (x < y), "\n");       // verdadeiro (1)
        escreva("x > y: ", (x > y), "\n");       // falso (0)
        escreva("x <= 10: ", (x <= 10), "\n");  // verdadeiro (1)
        escreva("y >= 20: ", (y >= 20), "\n");  // verdadeiro (1)

        // Comparação de caracteres
        caracter a = 'A', b = 'B';
        escreva("'A' < 'B': ", (a < b), "\n");  // verdadeiro (ASCII)
    }
}

Operadores Lógicos

Operadores Booleanos

Operador Descrição Exemplo Resultado
&& E lógico (AND) verdadeiro && falso falso
\|\| OU lógico (OR) verdadeiro \|\| falso verdadeiro
! NÃO lógico (NOT) !verdadeiro falso
programa {
    funcao inicio() {
        logico p = verdadeiro;
        logico q = falso;

        escreva("p = ", p, ", q = ", q, "\n");

        // Operador E (&&)
        escreva("p && q: ", (p && q), "\n");           // falso
        escreva("p && verdadeiro: ", (p && verdadeiro), "\n"); // verdadeiro

        // Operador OU (||)
        escreva("p || q: ", (p || q), "\n");           // verdadeiro
        escreva("q || falso: ", (q || falso), "\n");   // falso

        // Operador NÃO (!)
        escreva("!p: ", (!p), "\n");                   // falso
        escreva("!q: ", (!q), "\n");                   // verdadeiro

        // Combinações complexas
        escreva("!(p && q): ", (!(p && q)), "\n");     // verdadeiro
        escreva("!p || !q: ", ((!p) || (!q)), "\n");  // verdadeiro (Lei de De Morgan)
    }
}

Avaliação de Curto-Circuito

programa {
    logico sempre_verdadeiro() {
        escreva("Função sempre_verdadeiro chamada\n");
        retorne verdadeiro;
    }

    logico sempre_falso() {
        escreva("Função sempre_falso chamada\n");
        retorne falso;
    }

    funcao inicio() {
        // Com &&, se o primeiro for falso, o segundo não é avaliado
        escreva("Teste 1: ");
        se (sempre_falso() && sempre_verdadeiro()) {
            escreva("Condição verdadeira\n");
        }

        // Com ||, se o primeiro for verdadeiro, o segundo não é avaliado
        escreva("Teste 2: ");
        se (sempre_verdadeiro() || sempre_falso()) {
            escreva("Condição verdadeira\n");
        }
    }
}

Operadores Bitwise

Operações em Bits

Operador Descrição Exemplo Resultado
& E bitwise (AND) 5 & 3 1
\| OU bitwise (OR) 5 \| 3 7
^ OU exclusivo (XOR) 5 ^ 3 6
~ Complemento (NOT) ~5 -6
<< Deslocamento à esquerda 5 << 1 10
>> Deslocamento à direita 10 >> 1 5
programa {
    funcao inicio() {
        inteiro a = 5;  // 101 em binário
        inteiro b = 3;  // 011 em binário

        escreva("a = ", a, " (101 binário)\n");
        escreva("b = ", b, " (011 binário)\n");

        // Operações bitwise
        escreva("a & b = ", (a & b), "\n");    // 1 (001)
        escreva("a | b = ", (a | b), "\n");    // 7 (111)
        escreva("a ^ b = ", (a ^ b), "\n");    // 6 (110)
        escreva("~a = ", (~a), "\n");          // -6 (complemento de 2)

        // Deslocamentos
        escreva("a << 1 = ", (a << 1), "\n"); // 10 (1010)
        escreva("a >> 1 = ", (a >> 1), "\n"); // 2 (10)

        // Aplicações práticas
        inteiro numero = 16;
        escreva("Testar se ", numero, " é par: ", ((numero & 1) == 0), "\n");
        escreva("Multiplicar por 4 (<<2): ", (numero << 2), "\n"); // 64
        escreva("Dividir por 2 (>>1): ", (numero >> 1), "\n");     // 8
    }
}

Precedência de Operadores

Tabela de Precedência (do maior para o menor)

Precedência Operadores Associatividade Descrição
1 () [] Esquerda → Direita Parênteses, índices
2 ! ~ + - ++ -- Direita → Esquerda Unários
3 * / % Esquerda → Direita Multiplicativos
4 + - Esquerda → Direita Aditivos
5 << >> Esquerda → Direita Deslocamento
6 < <= > >= Esquerda → Direita Relacionais
7 == != Esquerda → Direita Igualdade
8 & Esquerda → Direita E bitwise
9 ^ Esquerda → Direita XOR bitwise
10 \| Esquerda → Direita OU bitwise
11 && Esquerda → Direita E lógico
12 \|\| Esquerda → Direita OU lógico
13 = += -= *= /= %= Direita → Esquerda Atribuição

Exemplos de Precedência

programa {
    funcao inicio() {
        inteiro a = 5, b = 3, c = 2;

        // Sem parênteses - seguindo precedência
        inteiro resultado1 = a + b * c;        // 5 + (3 * 2) = 11
        escreva("a + b * c = ", resultado1, "\n");

        // Com parênteses - alterando precedência
        inteiro resultado2 = (a + b) * c;      // (5 + 3) * 2 = 16
        escreva("(a + b) * c = ", resultado2, "\n");

        // Exemplo complexo
        inteiro x = 10, y = 5, z = 2;
        inteiro complexo = x + y * z - x / y;  // 10 + (5*2) - (10/5) = 10 + 10 - 2 = 18
        escreva("x + y * z - x / y = ", complexo, "\n");

        // Com parênteses para clareza
        inteiro claro = x + (y * z) - (x / y); // Mesmo resultado, mais claro
        escreva("Com parênteses: ", claro, "\n");

        // Operadores lógicos e relacionais
        logico condicao = (a > b) && (c < b) || (x == 10);
        escreva("Condição complexa: ", condicao, "\n");
    }
}

Conversões e Casting

Conversões Automáticas

programa {
    funcao inicio() {
        inteiro i = 10;
        real r = 3.14;
        caracter c = 'A';

        // Conversões automáticas
        real resultado1 = i + r;        // int → float
        escreva("int + float: ", resultado1, "\n");  // 13.14

        inteiro resultado2 = c + i;     // char → int (ASCII)
        escreva("char + int: ", resultado2, "\n");   // 75 ('A' = 65)

        // Divisão inteira vs real
        inteiro div_int = 7 / 2;        // 3 (divisão inteira)
        real div_real = 7.0 / 2;        // 3.5 (divisão real)
        escreva("Divisão inteira: ", div_int, "\n");
        escreva("Divisão real: ", div_real, "\n");
    }
}

Boas Práticas

Clareza nas Expressões

// Bom: uso de parênteses para clareza
se ((idade >= 18) && (renda > 1000)) {
    processar_credito();
}
// Melhor ainda: variáveis descritivas
logico maior_idade = (idade >= 18);
logico renda_suficiente = (renda > 1000);
se (maior_idade && renda_suficiente) {
    processar_credito();
}

Evitar Efeitos Colaterais

// Evitar: múltiplos incrementos na mesma expressão
inteiro x = 5;
inteiro resultado = ++x + x++; // Comportamento indefinido
// Preferir: operações separadas
x = 5;
++x;                           // x = 6
resultado = x + x;             // 12
x++;                           // x = 7

Comparações Seguras

// Para números reais, evitar comparação exata
real a = 0.1 + 0.2;
real b = 0.3;
// Evitar
se (a == b) { /* pode falhar devido à precisão */ }
// Preferir
real tolerancia = 0.0001;
se ((a - b) < tolerancia && (a - b) > -tolerancia) {
    // comparação com tolerância
}

Exemplos Práticos

Calculadora com Todos os Operadores

programa {
    funcao menu() {
        escreva("\n=== CALCULADORA ===\n");
        escreva("1. Operações básicas (+, -, *, /, %)\n");
        escreva("2. Operações lógicas (&&, ||, !)\n");
        escreva("3. Operações bitwise (&, |, ^, ~, <<, >>)\n");
        escreva("4. Comparações (<, >, ==, !=, <=, >=)\n");
        escreva("0. Sair\n");
        escreva("Escolha: ");
    }

    funcao operacoes_basicas() {
        real a, b;
        escreva("Digite dois números: ");
        leia(a);
        leia(b);

        escreva("Soma: ", (a + b), "\n");
        escreva("Subtração: ", (a - b), "\n");
        escreva("Multiplicação: ", (a * b), "\n");

        se (b != 0) {
            escreva("Divisão: ", (a / b), "\n");
            escreva("Módulo: ", ((inteiro)a % (inteiro)b), "\n");
        } senao {
            escreva("Divisão por zero não é possível\n");
        }
    }

    funcao inicio() {
        inteiro opcao;

        faca {
            menu();
            leia(opcao);

            escolha (opcao) {
                caso 1:
                    operacoes_basicas();
                    pare;
                caso 0:
                    escreva("Saindo...\n");
                    pare;
                padrao:
                    escreva("Opção inválida!\n");
                    pare;
            }
        } enquanto (opcao != 0);
    }
}