Linguagens de Programação Aula 8

Documentos relacionados
Capítulo 7. Expressões e Sentenças de Atribuição

Linguagens de Programação. Marco A L Barbosa

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Operadores e Expressões: bit-a-bit e especiais

Linguagens de Programação

Capítulo 2 Operadores. A função scanf()

LÓGICA DE PROGRAMAÇÃO. PROFª. M.Sc. JULIANA H Q BENACCHIO

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Operadores. Tipo de operadores. Aritméticos. Relacionais. Lógicos. Bit a bit. Cálculos aritméticos: soma, subtracção, multiplicação, divisão, etc.

Introdução à Linguagem C++

7 Operadores e Expressões

C Operadores e Expressões

Algoritmos e Estruturas de Dados I (DCC/003) 2013/1. Estruturas Básicas. Aula Tópico 4

Paradigmas de Linguagens

Verificação de Tipo. Unions. Verificação de tipo estática. Verificação de tipo dinâmica

Lição 4 Fundamentos da programação

Variáveis primitivas e Controle de fluxo

Linguagem C Operadora

TÉCNICO DE INFORMÁTICA - SISTEMAS

5. Expressões aritméticas

Linguagem C Operadores

PROGRAMAÇÃO I E N T R A DA E S A Í DA D E DA D O S

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

Paradigmas de Linguagem de. Programação Profª. Roberta B Tôrres de programação referem-se a:

Programação Orientada a Objetos. Manipulação de Exceções

Introdução à Computação MAC0110

Paradigmas de Programação

quadrado(a)*0.5 -((a+2)*f(x,(1.0+n)/x)) Arquitectura de Computadores (2008/2009) - Linguagem C - Expressões 2

Introdução à Programação em C. Prof. Ricardo Teixeira Tecnologia em Mecatrônica Industrial SENAI

Paradigmas de Linguagens de Programação. Nomes, Vinculações, Verificação de Tipos e Escopos

Tipos, Literais, Operadores

INFORMÁTICA APLICADA AULA 03 LINGUAGEM DE PROGRAMAÇÃO C++

Linguagem C: Introdução

FACULDADE BATISTA MINEIRA - CST Banco de Dados Estruturas de Dados - Variáveis

EXPRESSÕES ARITMÉTICAS PARTE 1

Linguagens de Programação Aula 3

Linguagem de Maquina II. Visão Geral

Java 2 Standard Edition Tipos, literais, operadores e controle de fluxo

Introdução à Linguagem C Variáveis e Expressões

Variável. Expressões. Atribuição. Tipos básicos Declaração. Aritméticas Lógicas. Professor Leandro Augusto Frata Fernandes

Linguagens de Programação I

Apêndice A. Pseudo-Linguagem

Python - Variáveis e expressões

JAVA. Professor: Bruno Toledo

Arquitetura de Computadores. Professor: Vilson Heck Junior (Material: Douglas Juliani)

Arquitetura e Organização de Computadores

Programação de Computadores I Dados, Operadores e Expressões PROFESSORA CINTIA CAETANO

Referências. Linguagem C. Tipos de variáveis em XC8. Tipos de variáveis. Tipos de variáveis em XC 8 Exemplo. Radicais numéricos em C

Comandos em C (cont.)

Linguagens de Programação Conceitos e Técnicas. Amarrações

25/8/2010. Praticamente todas as arquiteturas de computadores fornecem mais de um modo de

Módulo 1. Introdução. AEDS I C++ (Rone Ilídio)

Trabalho Linguagem e Programação de Compiladores

Linguagens de Programação Funcional

Arquitetura e Organização de Computadores

Linguagem C: Variáveis e Operadores. Prof. Leonardo Barreto Campos 1

Introdução à Programação em C (II)

Linguagens de Programação PROGRAMAÇÃO DE COMPUTADORES. Linguagem C. Linguagem C Estrutura Básica. Constante (literais) Linguagem C Primeiro Programa

Programação com Acesso a BD. Programação com OO Acesso em Java

PROGRAMAS BÁSICOS EM C++ Disciplina: Introdução à Ciência da Computação Prof. Modesto Antonio Chaves Universidade estadual do Sudoeste da Bahia

Introdução a Programação

Nomes, Amarração, Verificação de Tipos, e Escopo

PORTUGUÊS ESTRUTURADO: INTRODUÇÃO INTRODUÇÃO À PROGRAMAÇÃO PROF. ALEXANDRO DOS SANTOS SILVA

Linguagem C Princípios Básicos (parte 1)

ao paradigma imperativo

Material Didático Unificado. Variáveis correspondem a nomes para endereços de memória que são gerenciados pelo Scilab.

Módulo Lógica Programação com aplicações em Java. Projeto khouse Profissionalizante Profª Larissa Brandão

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

Linguagens de Programação. Tipos. Carlos Bazilio

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: Operadores relacionais e lógicos estruturas condicionais If...

Nomes, Vinculações, Verificação de Tipos e Escopos. George Darmiton da Cunha Cavalcanti

Aula 12- Variáveis e valores reais

Programação: Vetores

Slides trabalhados durante a quinta aula

LINGUAGEM C: COMANDOS DE CONTROLE CONDICIONAL

02. [Sebesta, 2000] Qual é o perigo potencial dos nomes que fazem distinção entre maiúsculas e minúsculas?

Orientação a Objetos e Java

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

Ambientação com a Sintaxe de Java: parte 1

Algoritmos e Estruturas de Dados I IEC012. Linguagem C - Guia de bolso - Prof. César Melo

Programação de Computadores:

INF1007: Programação 2. 0 Revisão. 06/08/2015 (c) Dept. de Informática - PUC-Rio 1

Aula 4 Estruturas de Controle

01/08/2011. Tipos de dados Numéricos Alfanuméricos Lógicos. Numéricos. Tipos de dados. Dados Numéricos Inteiros. Dados Numéricos Reais.

Fábio Rodrigues / Israel Lucania

Introdução à Programação uma Abordagem Funcional

Programação Aplicada à Engenharia

Disciplina: Arquitetura de Computadores

Linguagens de Programação

SSC510 Arquitetura de Computadores 1ª AULA

Compiladores. Introdução à Compiladores

JavaScript (Elementos de Programação e Programação Básica)

Introdução à Programação

Linguagens Formais e Autômatos 02/2015. LFA Aula 02. introdução 28/09/2015. Celso Olivete Júnior.

Fundamentos de Programação. Turma CI-240-EST. Josiney de Souza.

Programação de Computadores:

Programação Básica em Arduino Aula 2

Transcrição:

Linguagens de Programação Aula 8 Celso Olivete Júnior olivete@fct.unesp.br

Na aula passada Os tipos de dados de uma linguagem são uma grande parte do que determina o estilo e a utilidade de uma linguagem Os tipos de dados primitivos da maioria das linguagens imperativas incluem os tipos numéricos, de caracteres e booleanos Os tipos de enumeração e de subfaixa definidos pelo usuário são convenientes e melhoram a legibilidade e a confiabilidade dos programas Matrizes fazem parte da maioria das linguagens de programação Ponteiros são usados para lidar com a flexibilidade e para controlar o gerenciamento de armazenamento dinâmico 2

Na aula de hoje Expressões e sentenças de atribuição 3

Roteiro 1. Introdução 2. Expressões aritméticas 3. Operadores sobrecarregados 4. Conversões de tipos 5. Expressões relacionais e booleanas 6. Avaliação em curto-circuito 7. Sentenças de atribuição 8. Atribuição de modo misto 4

Introdução Expressões são os meios fundamentais de especificar computações em uma linguagem de programação Para entender a avaliação de expressões, é necessário estar familiarizado com as ordens de avaliação de operadores e operandos A essência das linguagens imperativas é o papel dominante das sentenças de atribuição 5

Expressões aritméticas Avaliação aritmética foi uma das motivações para o desenvolvimento das primeiras linguagens de programação Expressões aritméticas consistem em operadores, operandos, parênteses e chamadas a funções 6

Expressões aritméticas questões de projeto 1. Quais são as regras de precedência de operadores? 2. Quais são as regras de associatividade de operadores? 3. Qual é a ordem de avaliação dos operandos? 4. Quais são os efeitos colaterais na avaliação de operandos? 5. A linguagem permite a sobrecarga de operadores definida pelo usuário? 6. Que tipo de mistura de tipos é permitida nas expressões? 7

Expressões aritméticas operadores Um operador unário tem um operando Um operador binário tem dois operandos Um operador ternário tem três operandos 8

Expressões aritméticas regras de precedência de operadores As regras de precedência de operadores para avaliação de expressões definem a ordem pela qual os operadores de diferentes níveis de precedência são avaliados Exemplo:a+b*csupondo a = 3; b=4 e c = 5 Se a expressão for avaliada da direita para a esquerda: 23 Se avaliada da esquerda para a direita: 35 9

Expressões aritméticas regras de precedência de operadores Níveis de precedência mais utilizado (hierarquia de prioridades) 1. parênteses 2. operadores unários 3. ** (exponenciação) quando apresentar 4. *, / 5. +, - 10

Expressões aritméticas regras de associatividade de operadores As regras de associatividade de operadores para a avaliação de expressões definem a ordem em que ocorrências adjacentes de operadores com o mesmo nível de precedência são avaliados Exemplo: a b + c d + e têm o mesmo nível de precedência, como determinar? 11

Expressões aritméticas regras de associatividade de operadores As regras de associatividade de operadores para a avaliação de expressões definem a ordem em que ocorrências adjacentes de operadores com o mesmo nível de precedência são avaliados Exemplo: a b + c d + e têm o mesmo nível de precedência, como determinar? É determinado por regras de associatividade 12

Expressões aritméticas regras de associatividade de operadores Regras de associatividade mais usadas Da esquerda para a direita, exceto **, que é da direita para a esquerda Operadores unários às vezes associam da direita para a esquerda (por exemplo, em FORTRAN) Regras de precedência e associatividade podem ser alteradas com o uso de parênteses. Exemplo: (a+b)*c neste caso, a adição será avaliada primeiro 13

Expressões aritméticas regras de associatividade de operadores Regras de associatividade Linguagem Regra de associatividade Ruby Esquerda: * / + - Direita: ** Ling. baseadas em C Esquerda: * / % + - Direita: ++ e -- 14

Expressões aritméticas regras de associatividade de operadores Regras de associatividade Em APL(ling. destinada a operações matemáticas) a regra de associatividade é determinada da direita para esquerda Exemplo: A*B+C O operador de adição é avaliado primeiro, seguido pelo operador de multiplicação 15

Expressões aritméticas expressões em Ruby Ruby é uma linguagem orientada a objetos pura todos os valores de dados são objetos Operadores aritméticos, relacionais e de atribuição, índices de matrizes, deslocamentos e operadores lógicos bit a bit, são implementados como métodos 16

Expressões aritméticas expressões em Ruby Exemplo:a+b É uma chamado ao método+do objeto referenciado pora, passando o objeto referenciado por b como parâmetro Um resultado interessante da implementação de operadores como métodos é que esses operadores podem ser sobrescritos por programas de aplicação. Também podem ser redefinidos 17

Expressões aritméticas expressões condicionais Expressões condicionais especificadas como sentença de atribuição Linguagens baseadas em C (como C e C++) Um exemplo:? Início do then : Início do else average = (count == 0)? 0 : sum / count Avalia como se fosse escrita como if (count == 0) average = 0 else average = sum /count 18

Expressões aritméticas ordem de avaliação de operandos 1. Variáveis: avaliadas a partir da obtenção dos seus valores a partir da memória 2. Constantes: algumas vezes avaliadas da mesma maneira. Em outros casos, é parte da instrução de linguagem de máquina e não requerer uma busca em memória 19

Expressões aritméticas ordem de avaliação de operandos 3. Expressões entre parênteses: avaliam todos os operadores que ela contêm antes de seu valor poder ser usado como operando 4. O caso mais interessante surge quando a avaliação de um operando tem efeitos colaterais 20

Expressões aritméticas efeitos colaterais Efeitos colaterais funcionais: quando a função modifica um de seus parâmetros ou uma variável global (uma variável global é declarada fora da função, mas é acessível na função) Problema com efeitos colaterais funcionais: Quando uma função referenciada em uma expressão altera outro operando da expressão; por exemplo, para uma mudança de parâmetro: 21

Expressões aritméticas efeitos colaterais Exemplo: a = 10; b = a + fun(a); Supondo que fun retorna 10 e modifica o valor do seu parâmetro para 20 Então se o valor de a for obtido primeiro (no processo de avaliação da expressão), seu valor é 10 e o valor da expressão b é 20 Se o segundo operando (fun(a)) for avaliado primeiro, o valor do primeiro operando é 20 e o valor da expressãobé30 22

Expressões aritméticas efeitos colaterais Exemplo 2: int a = 5; int fun1(){ } a = 17; return 3 void main(){ } a = a + fun1(); O valor calculado para a em main depende da ordem de avaliação dos operandos na expressãoa+fun1() O valor de a será 8 se a for avaliado primeiro 23

Expressões aritméticas efeitos colaterais Exemplo 2: int a = 5; int fun1(){ } a = 17; return 3 void main(){ } a = a + fun1(); O valor calculado para a em main depende da ordem de avaliação dos operandos na expressãoa+fun1() O valor de a será 8 se a for avaliado primeiro O valor de a será 20 se a chamada a função for avaliada primeiro 24

Expressões aritméticas efeitos colaterais Duas possíveis soluções para o problema 1. Escrever a definição de linguagem para proibir efeitos colaterais funcionais Não permitir parâmetros de duas direções Não permitir variáveis globais Vantagem: funciona! Desvantagem: limitado a parâmetros de uma direção e falta de referências globais 2. Dizer na definição da linguagem que os operandos em expressões devem ser avaliados em uma certa ordem Desvantagem: limita algumas otimizações do compilador Java garante que os operandos sejam avaliados da esquerda para a direita 25

Operadores sobrecarregados Usar um operador para mais de um propósito é chamado de sobrecarga de operadores Alguns são comuns (por exemplo, + para operações com int e float) Alguns são problema em potencial (por exemplo, & em C e C++) Como um operador binário ele especifica uma operação lógica E (AND) Como um operador unário seu significado é o endereço de uma variável. Ex:x=&y; Perda de detecção de erro do compilador (omissão de um operando deve ser um erro detectável) Alguma perda da legibilidade 26

Operadores sobrecarregados C++ e C# permitem operadores sobrecarregados definidos pelo usuário Problemas em potencial: Usuários podem definir operadores sem sentido Facilidade de leitura pode ser prejudicada, mesmo quando os operadores fazem sentido 27

Conversões de tipos Uma conversão de estreitamento - converte um valor para um tipo que não pode armazenar aproximações equivalentes a todos os valores do tipo original. Por exemplo, float para int Uma conversão de alargamento converte um valor para um tipo que pode incluir ao menos aproximações de todos os valores do tipo original. Por exemplo, int para float Exercício: tanto o tipo int quanto o tipo float são armazenados utilizando 32 bits. Realize uma operação de alargamento (int para float) e verifique se ocorre a perda de dígitos de precisão 28

Conversões de tipos expressão de modo misto Uma expressão de modo misto tem operandos de tipos diferentes Uma coerção é um tipo implícito de conversão Desvantagem de coerções: Eles diminuem a capacidade de detecção de erros do compilador Na maioria das linguagens, todos os tipos numéricos têm coerção nas expressões, usando conversões de alargamento Em Ada, praticamente não há coerções nas expressões 29

Conversões de tipos modo misto Ex: expressões de modo misto na linguagem Java int a; float b, c, d... d = b * a; Essa expressão é permitida em Java, logo o compilador não consegue detectar o erro (c ao invés do a, por exemplo) É inserido um código para realizar a coerção (implícita) do operando a em float. 30

Conversões de tipos explícita Chamadas de cast em linguagens baseada em C Exemplo C: (int)angle Usa-se o parênteses no tipo devido às primeiras versões de C - apresentava nomes de tipos com duas palavras. Exemplo: long int 31

Conversões de tipos Erros em expressões Causas Limitações inerentes da aritmética por exemplo, divisão por zero Limitações da aritmética computacional por exemplo, transbordamento (overflow) ou transbordamento negativo (underflow) Esses erros são detectados em tempo de execução do sistema - exceções 32

Expressões relacionais e booleanas Expressões relacionais Um operador relacional compara os valores de seus dois operandos (op1 oprel op2) Uma expressão relacional tem dois operandos e um operador relacional O valor de uma expressão relacional é booleano Símbolos de operação variam um pouco entre as linguagens. Operadores de desigualdade:!=,/=, ~=,.NE., <> 33

Expressões relacionais e booleanas Expressões booleanas Operandos são booleanos e o resultado é booleano Exemplos de operadores booleanos FORTRAN 77 FORTRAN 90 C Ada.AND. and.or. or.not. not && and or! not 34

Expressões relacionais e booleanas sem tipo booleano em C C não tem um tipo booleano - usa o tipo int com 0 para falso e todos diferentes de zero como verdadeiro Uma característica estranha de expressões C: a < b < c é uma expressão legal, mas o resultado pode não ser esperado: Operador da esquerda é avaliado, produzindo 0 ou 1 O resultado da avaliação é então comparado com o terceiro operando (no exemplo, c) b<cnunca é feito nessa expressão 35

Avaliação em curto-circuito Uma avaliação em curto-circuito é uma expressão na qual o resultado é determinado sem avaliar todos os operandos e/ou operadores Exemplo: (13*a) * (b/13 1) Se a é zero, não há necessidade de avaliar (b/13-1) Exemplo: (a>=0) && (b<10) Se a é menor que zero, não há necessidade de avaliar (b<10) 36

Avaliação em curto-circuito Problema com avaliação que não é em curto-circuito. Ex: busca elemento em uma tabela index = 1; while (index <= length) && (LIST[index]!= value) index++; Se a avaliação não fosse em curto-circuito Quando index=length, LIST [index] causa um erro de indexação (assumindo que LIST tem elementos length-1) 37

Avaliação em curto-circuito C, C++ e Java: usa avaliação em curtocircuito para operadores booleanos usuais (&& e ) E e OU 38

Sentenças de atribuição Sentenças de avaliação é uma das construções centrais em LP s imperativas mecanismo onde o usuário pode mudar dinamicamente as vinculações de valores a variáveis A sintaxe geral <target_var> <assign_operator> <expression> O operador de atribuição = FORTRAN, BASIC e linguagens baseadas em C := ALGOL, Pascal, Ada = pode ser ruim quando está sobrecarregado para o operador relacional de igualdade (por isso que as linguagens baseadas em C usam == como operador relacional) 39

Sentenças de atribuição alvos condicionais Alvos condicionais (Perl) ($flag? $total : $subtotal) = 0 que é equivalente a if ($flag){ $total = 0 } else { $subtotal = 0 } 40

Sentenças de atribuição operadores compostos É um método de atalho para especificar uma forma de atribuição comumente necessária Introduzida em ALGOL; adotada por C Exemplo a = a + b é escrito como a += b 41

Sentenças de atribuição operadores de atribuição unários Operadores de atribuição unários em linguagens baseadas em C combinam operações de incremento e decremento com atribuição Exemplos sum = ++count(count incrementado de uma unidade, adicionado a sum) sum = count++(count adicionadoasum, count incrementado) count++(count incrementado de uma unidade) -count++(count incrementado então negado) Obs: quando dois operadores são aplicados ao mesmo operando, a associação é feita da direita para esquerda 42

Sentenças de atribuição Atribuição como uma expressão Em C, C++ e Java, a sentença de atribuição produz um resultado e pode ser usada como operandos Um exemplo: while ((ch = getchar())!= EOF){ } ch = getchar() é realizado; o resultado (atribuído a ch) é usado como valor condicional para a sentença while 43

Sentenças de atribuição Atribuição como uma expressão Em C, C++ e Java, a sentença de atribuição produz um resultado e pode ser usada como operandos Um exemplo: soma = contador = 10; contador=10 é realizado; o resultado é atribuído a soma 44

Sentenças de atribuição Atribuição como uma expressão Em C, C++ e Java, a sentença de atribuição produz um resultado e pode ser usada como operandos Esse mecanismo ocasiona uma perda da detecção de erros. Um exemplo considerando a ling. C: if(x=y)... ao invés de if(x==y)...; Não gera erro: o valor de y é adicionado a x e então x é testado. O resultado gerado é diferente do esperado Java e C# permitem apenas expressões booleanas em sentenças IF, logo esse problema não ocorre 45

Sentenças de atribuição Atribuições de listas Perl e Ruby suportam atribuições de lista por exemplo, ($first, $second, $third) = (20, 30, 40); 46

Sentenças de atribuição Atribuição de modo misto Sentenças de atribuição também podem ser de modo misto Em Fortran, C e C++, qualquer valor de tipo numérico pode ser atribuído a uma variável de tipo numérico Em Java, apenas se a coerção requerida é de alargamento Ada não permite atribuição de modo misto 47

Resumo Expressões Precedência e associatividade de operador Sobrecarga de operador Expressões de modo misto Várias formas de atribuição 48

Exercícios Questões de revisão 1, 8, 9, 10, 12 e 18 Conjunto de problemas 3, 4, 7, 9, 10 e 13 Exercícios de programação 1, 3, 8 e 9 49