Sie sind auf Seite 1von 83

Expressões e Comandos

Sumário

Parte 01 Expressões
Parte 02 Operadores
Parte 03 Comandos
Parte 04 Exercícios
Expressões
Definição de Expressões

“ Uma expressão é uma frase do programa que


necessita ser avaliada e produz como resultado um
valor. Expressões são caracterizadas por operadores,
operandos e um resultado.
F.M. Varejão (2004)

Elementos de Expressões

Operadores
Designam o tipo de operação a ser realizada

Operandos
Indicam os valores necessários para as operações

Resultados
É o valor produzido pela avaliação da expressão
Classificação de Expressões

Simples
Expressões que envolvem apenas um operador

Compostas
Expressões que envolvem mais de um operador
Notação de Expressões

Notação Prefixada: Operador antes dos operandos

Notação Infixada: Operador entre os operandos

Notação Posfixada: Operador após os operandos


Notação de Expressões

a = !b; // Expressão
prefixada

a = a + b; // Expressão infixada

a = b++; // Expressão
posfixada
Tipos de Expressões

9. EFEITOS
1. LITERAIS 5. BOOLEANAS
COLATERAIS

2. AGREGAÇÃO 6. BINÁRIAS 10. REFERENCIAMENTO

3. ARITMÉTICAS 7. CONDICIONAIS

11. CATEGÓRICAS

8. CHAMADAS DE
4. RELACIONAIS
FUNÇÕES
Literais

❏ Trata-se do tipo mais simples de expressão


❏ Utilizada para produzir um valor fixo e manifesto de um tipo
❏ Não demanda o uso de um operador explícito

float meu_float = 2.72;


int meu_int = 99;
int meu_int = 0143;
char meu_char = ‘c’;
int meu_int = 0x63;
Agregação

❏ Constrói um valor composto a partir de suas subexpressões


❏ Delimitado por marcadores de ínicio e fim da expressão:
▪ Podem ser caracteres de chaves, colchetes, aspas duplas
❏ Subexpressões podem ser separadas por um símbolo:
▪ Podem ser caracteres de ponto e vírgula, vírgulas...

int c[] = {1, 2, 3};


struct data = {1, 7, 1999};
int b[6] = {0};
char *y = “abc”;
Agregações podem ser...

Estáticas
Avaliadas em tempo de compilação

Dinâmicas
Avaliadas em tempo de execução
Agregação

❏ Considere o código abaixo escrito em C:


void function(int i) {
int a[] = {3 + 5, 2, 16/4};
int b[] = {3*i, 4*i, 5*i};
int c[] = {i+2, 3+4, 2*i};
}

❏ A agregação que inicializa o vetor de a é estático


❏ A agregação que inicializa o vetor de b é dinâmico
❏ A agregação que inicializa o vetor de c é estático e dinâmico
Expressões Relacionais

❏ Expressões para comparar valores de operandos:


▪ Operações de maior, menor, maior igual, igual, diferente...
▪ É claro que os valores devem ser do mesmo tipo de dado
❏ Tipicamente, o resultado da expressão é um valor booleano:
▪ Em algumas linguagens, como o C, o resultado é um valor

a == b
a != b
1 <= a <= 3
a > b
Expressões Booleanas

❏ Expressões que realizam as operações da Álgebra de Boole:


▪ Operações booleanas de negação, conjunção ou disjunção
❏ Operandos são valores do tipo booleano ou equivalente
❏ Resultado será compatível aos operandos utilizados

bool b = false || true;


bool c = !true
bool a = b && c;
bool j = !(c && a) || b;
Expressões Binárias

❏ Expressões que realizam as operações sobre dígitos binários:


▪ Tais operações manipulam dados em nível de bits
▪ Operações booleanas e de deslocamento de bits
❏ Em C, os operandos de entrada são baseados em inteiros:
▪ A manipulação é possível através de conversão implícita

int i = 10, j = 2;
int a = j | c;
int b = j << c;
int b = j >> c;
Expressões Condicionais

❏ Expressões que são compostas por várias subexpressões:


▪ Possuem, pelo menos, duas subexpressões
▪ Retornam, como resultado, o valor de exatemente uma
❏ Expressões são avaliadas de acordo com o contexto

int max = x > y ? x : y;

max = x if x > y else max = y;


Chamadas de Funções
❏ Expressões referenciadas por um nome e operandos:
▪ Os operandos são os parâmetros de entrada da função
❏ Possibilitam a criação de expressões com qualquer aridade
❏ Considere o código abaixo escrito na linguagem ML:
No de argumento ou de
comandos que uma
função requer
val taxa = (if difPgVenc > 0 then
desconto else multa)
(difPgVenc)

❏ difPgVenc, desconto e multa são funções, mas não são


invocadas com os parênteses que indicam ser uma função
Chamadas de Funções

❏ Uma função só é invocada através do seu identificador


❏ Existem funções que tratam funções como valores normais:
▪ Chamada a uma função é realizada como de uma variável
❏ Operadores podem ser vistos como chamadas de funções:
▪ Funções lógicas e matemáticas que usam notação infixada

a*b; // *(a, b)
a*b+c/d; // +(*(a, b), /(c, d))
!a // !(a)
d&&c; // &&(d,c)
Efeitos Colaterais

❏ De forma geral, expressões são executadas e retornam valores


❏ Contudo, algumas delas podem produzir efeitos colaterais:
▪ São ações não esperadas a priori na execução da expressão
❏ Considere o código abaixo escrito na linguagem C:

x = 3.2 * ++c;

❏ A expressão acima produz um efeito colateral:


▪ O valor da variável C é incrementado em uma unidade
Efeitos Colaterais

❏ Outro exemplo (menos óbvio):

#include <stdio.h>
int main(){
FILE *pFile;
int c;
pFile = fopen(“myfile.txt”, “r”);
c = fgetc(pFile);
}

❏ A finalidade da função fgetc() é retornar um caractere:


▪ Porém, intrinsecamente ela desloca o ponteiro de arquivo
Efeitos Colaterais podem...

Dificultar a legibilidade e o entendimento

Introduzir indeterminismos
Efeitos Colaterais

❏ Considere o código abaixo escrito em C:

#include <stdio.h>
int main(){
int x = 2, y = 4;
int z;
z = (y = 2 * x + 1) + y;
printf(“%d %d %d”, x, y, z)
}

❏ É um exemplo de efeito colateral não determinístico


❏ Você consegue, facilmente, determinar o que o código faz?
Referenciamento

❏ Expressões para retornar referências de variáveis e constantes


ou acessar os conteúdos por elas armazenados

❏ Considere o código abaixo escrito na linguagem C:

*q = *q + 3;

❏ A mesma expressão (*q) em ambos os lados da atribuição:

▪ No lado esquerdo, o *q representa a região de memória


▪ No lado direito, o *q representa o valor armazenado
Referenciamento

❏ C++ e Java possuem outra expressão de referenciamento

❏ Trata-se do operador new que cria um objeto de uma classe


❏ Considere o código abaixo escrito na linguagem Java:

Cachorro toto = new Cachorro();

❏ O new aloca região de memória para um objeto de Cachorro

❏ O new retorna a referência à região alocada para toto


Categóricas
❏ Expressões que realizam operações sobre tipos de dados:
▪ Extrair informações do tipo de uma variável ou constante
▪ Converter um valor de um tipo de dado para outro
❏ Em C, essas expressões são representadas por:
▪ Operador sizeof() e o operador de conversão de tipo (cast)

float *p = null;
p = (float *) malloc sizeof(float));
int num = 9, den = 5;
float f = (float) num / den;
Categóricas

❏ C++ e JAVA oferecem outra forma de expressão categórica:


▪ Verificar dinamicamente o tipo de dado de uma variável
❏ C++ oferece o operador typeid, Java oferece o instanceof
❏ Considere o código abaixo escrito em Java:

Profissao p = new Engenheiro();


if (p instanceof Medico)
System.out.println(“CRM”);
if (p instanceof Engenheiro)
System.out.println(“CREA”);
Operadores
Classificação quanto a aridade

Operadores unários: Um operando

Operadores binários: Dois operandos

Operadores ternários: Três operandos

Operadores eneários: N operandos


Operadores eneários

❏ Operadores eneários são raros em linguagens de programação


▪ Prejudica a legibilidade e a redigibilidade do programa
▪ Isso desistimula a utilização desses operadores

❏ Linguagens como APL e LISP oferecem operadores eneários


▪ Outras linguagens como C/C++, Java e Pascal não possuem

❏ C/C++ permite criar funções com um número de parâmetros


variável, já linguagens como JAVA e PASCAL não suporta
Classificação quanto a origem

Pré-existentes
Normalmente são operadores unários ou binários

Definidos pelo Programador


Normalmente são funções com qualquer aridade

Composição de Operadores
Programador cria novos operadores com base nos já existentes
Precedência de Operadores


Normalmente, os operadores de uma linguagem de
programação são ordenados por grau de precedência.
Operações cujos operadores possuem maior precedência são


realizadas antes das operações relacionadas aos operadores
de menor precedência.
F.M. Varejão (2004)
Precedência de Operadores

❏ Falta de precedência dificulta a legibilidade e redigibilidade:


▪ Uma escolha inadequada também pode ser prejudicial
❏ Considere o código abaixo escrito em Pascal:

if a > 5 and b < 10 then a := a + 1;

❏ A precedência, nesse caso, geraria erro de compilação:


▪ Primeiramente, seria avaliada a expressão 5 and b
▪ Como nenhum operando é booleano, isso geraria erro
Precedência de Operadores

❏ Parênteses asseguram uma maior legibilidade:


▪ Podem também dispensar o suporte a precendência da LP
▪ Contudo prejudicam um pouco a redigibilidade do código

❏ Considere o mesmo código em Pascal, mas com parênteses

if (a > 5) and (b < 10) then a := a + 1;

❏ Mais caracteres precisam ser digitados, mas simplifica a


visualização e facilita a interpretação da expressão

❏ Caracteres demais podem prejudicar a legibilidade


Precedência de Operandos

❏ Define a ordem na qual os operandos devem ser avaliados


❏ Algumas linguagens não definem essa precedência:
▪ Compilador é o responsável por definir a ordem de
avaliação
▪ Isso gera um não determinismo na forma de avaliação
❏ Considere o código abaixo escrito em C:

a[i] = i++;

❏ O índice i do vetor será o valor de i antigo ou o novo?


Atenção!

Algumas linguagens definem a regra de precedência.


Java estabelece que os operandos são sempre avaliados
da esquerda para a direita. Isso possibilita um maior
determinismo nas implementações em Java. Contudo, a
adoção de precedência entre operandos inibe certos
tipos de otimização de código.
Associatividade de Operadores

“ Regras de Associatividade de operadores são usadas quando


a linguagem de programação não define regras de
precedência entre os operadores ou quando os operadores
da expressão têm a mesma precedência.

F.M. Varejão (2004)



Associatividade de Operadores
❏ Considere a expressão abaixo escrita na linguagem C

x = a + b - c;

❏ A associativade define qual operador será avaliado primeiro

❏ Comumente, a associatividade é no sentido esquerda/direita:


▪ Em C, para alguns operadores a associatividade é no
sentido contrário, ou seja, no sentido direita/esquerda

❏ Considere a expressão abaixo escrita na linguagem C:

a = b = c;
Tabela Resumo

Tabela de Precedência e Associatividade de Operadores em C (Fonte: Varejão,2004 )


Exercícios
Exercício 1

• Pesquise sobre o conceito de curto-circuito em


Linguagens de Programação.

• Apresente um exemplo de expressão em C onde


ocorre um curto-circuito.

• Analise o efeito que a expressão pode produzir sobre


a legibilidade e o desempenho de um programa.
Exercício 2

• Pesquise sobre o conceito sobrecarga de operadores


e pondere sobre as principais vantagens e
desvantagens associadas a este recurso.

• Uma linguagem de programação X deveria suportar


ou não este recurso?
Exercício 3

• Pesquise sobre os operadores disponibilizados nas


linguagens Java, Python, LISP e Haskell.

• Traga para a sala o símbolo do operador, um exemplo


sintático e qual a operação que ele realiza.
Comandos
Definição de Comandos

“ Comandos são instruções do programa que tem


como objetivo atualizar as variáveis ou controlar o
fluxo de controle do programa. Comandos são
característicos de linguagens imperativas.
F.M. Varejão (2004)

Classificação de Comandos

Primitivos
Não podem ser divididos em subcomandos

Compostos
Formados por dois ou mais subcomandos
Tipos de Comandos

4. COMANDOS
1. ATRIBUIÇÕES
CONDICIONAIS

7. COMANDOS DE
2. COMANDOS 5. COMANDOS DESVIO
SEQUENCIAIS ITERATIVOS INCONDICIONAL

3. COMANDOS 6. CHAMADAS DE
COLATERAIS PROCEDIMENTO
Atribuições

❏ Operação que atualiza o valor armazenado em uma variável


❏ Problema com a operação de igualdade da matemática
❏ Linguagens como C/C++ e JAVA usam o operador ‘=’:
❏ Linguagens como ADA e PASCAL usam o operador ‘:=’

int i = 4;

i:integer;
i := 4;
Tipos de Atribuições

Atribuição Simples

Atribuição Múltipla Atribuição Unária

Atribuição Condicional Atribuição Expressão

Atribuição Composta
Sequenciais
❏ Sequência de comandos a serem executados:
▪ Normalmente, estão associados ao conceito de bloco

❏ Comando antecedente executado antes do subsequente

❏ Possibilita a abstração de um bloco em um único comando

{
int n = 1;
if (n < 5) {
int m = n * 2;
}
}
Colaterais

❏ Trata-se de um comando incomum em linguagens imperativas

❏ Não existe uma ordem prévia para a execução dos comandos:


▪ Trata-se de uma forma de computação não determinística

❏ Importantes para linguagens ligadas a processamento paralelo

❏ Considere o seguinte trecho de código na linguagem ML:

val altura = 2
and largura = 3
and comprimento = 5
Condicionais

❏ Também conhecido como comando ou estrutura de seleção

❏ Especifica caminhos alternativos ao fluxo do programa


❏ Número de caminhos alternativos especificados podem variar
e dependerá da codificação do desenvolvedor
❏ Número de caminhos alternativos seguidos dependerão se
determinadas condições serão satisfeitas ou não
Tipos de comandos condicionais

Seleção de Caminho Condicionado

Seleção de Caminho Duplo

Seleção de Caminhos Múltiplos


Seleção de Caminho Condicionado

❏ O trecho do programa será executado se uma determinada


condição for satisfeita. Por exemplo:

if (x > 0) {
x = x + 1;
}

❏ Nesse caso, a variável ‘x’ será incrementada em 1 se o seu


valor for estritamente positivo, ou seja, se a condição x > 0 for
verdadeira
Seleção de Caminho Duplo
❏ O comando permite que exista dois caminhos alternativos ao
fluxo do programa em resposta a uma condição. Por exemplo:

if (x > 0) {
x = x + 1;
} else {
x = x - 1;
}

❏ A variável ‘x’ ganha um novo caminho (comando else).

❏ No caso de ‘x’ ser um número negativo (menor igual que zero)


o seu valor será decrementado em 1.
Seleção de Caminhos Múltiplos

❏ Tal comando permite a escolha de um ou vários dos caminhos


alternativos ao fluxo original do programa

❏ A escolha do caminho depende do resultado de uma expressão

❏ A escolha de vários caminhos dependerá se o procedimento de


verificação será encerrado ou não

❏ Existem variações significativas nessas estruturas:


▪ Em PASCAL, por exemplo, o referido comando é nomeado
como case e, após a execução de um caminho, o fluxo
segue automaticamente para o fim do condicional
Seleção de Caminhos Múltiplos

❏ Considere, por exemplo, o código abaixo escrito em C:

switch (nota) {
case 10:
case 9:
printf(“Excelente!!”);
break;
case 8:
case 7: printf(“Bom”);
default: printf(“Estudar mais”)
}
Atenção!

Algumas linguagens de programação como C e Pascal


restrigem as expressões usadas nessa condição como
resultados a constantes de tipos ordinais. Quando a
seleção deve ser feita com base em expressões lógicas
devem ser usados comandos de if aninhados
Seleção de Caminhos Múltiplos

❏ Considere, por exemplo, o código abaixo escrito em C:

if (nota >= 9 && nota <= 10) {


printf(“Excelente!!”);
}
else if (nota >= 7 && nota <= 8) {
printf(“Bom”);
}
else {
printf(“Estudar mais”);
}
Atenção!

Algumas linguagens de programação reconhecem a


importância desse tipo de construção e criaram um
comando específico para ifs aninhados. Por exemplo, no
Python, o comando equivalente ao else if é o elif
Iterativos

Comandos iterativos são aqueles responsáveis por


executar zero, uma ou mais vezes uma única linha ou
um bloco inteiro de código.
Iterativos

❏ Também conhecido como comando ou estrutura de repetição

❏ Comportamento típico de linguagens imperativas

❏ Número de repetições pode ser definido previamente ou não

❏ Proporciona repetições no fluxo original do programa:


▪ A quantidade de repetições dependerá se determinadas
condições serão satisfeitas ou não
Tipos de Comandos Iterativos

Controlados por contagem


Continuidade depende de uma variável

Controlados por lógica


Continuidade depende de uma expressão lógica
Controlados por Contagem

❏ Baseados em uma variável denominada variável de loop

❏ São definidos os valores iniciais e finais da variável de loop:


▪ Também é definida a operação realizada a cada iteração
❏ Principal exemplo, o comando for

❏ Considere, por exemplo, o código abaixo escrito em C:

for (int i = 0; i < 10; i++) {


printf(“Valor = %d\n”, i);
}
Controlados por Contagem

❏ Existe também uma versão alternativa ao for do C

❏ Nesta versão a variável percorre um objeto iterável:


▪ A variável de loop assume um dado de um objeto iterável
▪ A cada iteração a variável de loop assume um novo dado
❏ Considere, por exemplo, o código abaixo escrito em Python:

for ( i in range(1,11)):
print “Valor = %d\n” % i
Controlados por Lógica
❏ Baseados em uma ou mais expressões booleanas

❏ O loop continua ou não de acordo com a expressão booleana:


▪ Em C, o laço continua enquanto a expressão for verdadeira

❏ Principal exemplo, são os comandos while e do...while

❏ Considere, por exemplo, o código abaixo escrito em C:

while i < 10 do
write (‘Valor = ’, i, ‘ \n’);
i := i + 1;
end;
Controlados por Lógica

Pré-Teste
Cláusula verificada antes da execução do corpo

Pós-Testes
Cláusula verificada após a execução do corpo
Controlados por Lógica
❏ O exemplo abaixo escrito em C exemplifica o while:

while (i < 10) {


printf(“Valor = %d\n”, i);
i++;
}

❏ O exemplo abaixo escrito em C exemplifica o do...while:


do {
i++;
printf(“Valor = %d\n”, i);
} while(i < 10);
Atenção!

Algumas linguagens de programação apresentam um


mecanismo que permitem a inserção de uma cláusula
else posterior a definição de um comando while e do
bloco de código a ele associado
Controlados por Lógica

❏ Nesse caso, o else será chamado quando a condição for falsa:


❏ Chamada sempre quando o laço for executado por completo:
▪ Nenhuma exceção foi lançada, nenhum break invocado
❏ Considere, por exemplo, o código abaixo escrito em Python:

while cont < 5:


print count, ‘é maior do que 5’
count = count + 1
else:
print count, ‘é menor do que 5’
Chamadas de Procedimentos

❏ O que é procedimento? Função sem retorno de informação


▪ Obedece, basicamente, os mesmos príncipios da função

❏ Principal objetivo é atualizar o valor de uma variável:


▪ Variáveis são recebidas como parâmetros de entrada
▪ Seus valores são atualizados e “retornados” ao invocador
Comandos de Desvio

Comandos de Desvio são aqueles responsáveis por


realizar desvios na execução de um programa, mas de
forma incondicional.
Tipos de comandos de desvio

Desvios Irrestritos
Saltos no fluxo do programa através de um rótulo

Escapes
Permitem sair do bloco ao qual pertencem

Exceções
Ocorrências não previstas durante a execução do bloco
Quatro comandos em C

break

continue

return

goto
goto

❏ Realiza saltos no código com base em rótulos


❏ Desenvolvedor espalha rótulos pelo código:
▪ Um rótulo é um identificador seguido de dois-pontos (:)
❏ Através do goto, referencia o identificador definido
❏ Toda vez que o goto for executado:
▪ O fluxo será alterado para o local onde o rótulo foi
definido
❏ Permite realizar comandos de iteração e condicional
goto
Exercícios
Exercício 1

• Um programa deve ler uma sequência de números


inteiros e imprimí-los.
• O programa deve ser encerrado quando o número
lido for zero.
• Implemente-os em C usando comandos iterativos
com pré-teste, pós-teste e comando de escape.
• Discuta as soluções em termos de redigibilidade e
eficiência.
Exercício 2

• Pesquise e analise a importância dos comandos


Colaterais para as linguagens de programação de
processamento paralelo.
• Os comandos realmente implementam
comportamentos não determinísticos?
• Caso positivo, em que situações isso pode ser útil
para a computação?
Exercício 3

Pesquise e exemplifique os tipos de atribuições


disponibilizados nas seguintes linguagens: Python, C,
Pascal e LISP.
Exercício 4

• Pesquise e analise o porquê de algumas linguagens de


programação como o C, por exemplo, manterem o
suporte ao goto.
• Exemplifique, com um trecho de programa em C, uma
situação na qual pode ser útil empregar o comando goto.
Exercício 5

• Pesquise e analise o porquê de linguagens como o


Python inserirem uma clásula else posterior ao bloco
associado ao comando while.
• Exemplifique, com um trecho de programa em
Python, uma situação na qual pode ser útil empregar
a clásula else posterior ao while.
Expressões e Comandos

Slides baseados em material cedido por


Prof. Me. Filipe Fernandes dos Santos Brasil de Matos

Das könnte Ihnen auch gefallen