Professional Documents
Culture Documents
Pg. 1
Tpicos
1. 2. 3. 4. 5. 6. 7. 8. Introduo Expresses Aritmticas Sobrecarga de Operadores Converso de Tipos Expresses Relacionais e lgico Avaliao Curto-Circuito Instrues de Atribuio Atribuio de Modo Misto
Engenharia Informtica Linguagens de Programao 2002/2003
Pg. 2
1. Introduo
Qual o resultado das seguintes expresses em C, C++ e Java: int a = 1, b = 2, c = 3; 1) -a*-b+-c; 2) ++a+a++; 3) +a+++ ++b+---c; Sero equivalentes as seguintes expresses? 1) -a-b -(a-b) (-a) - (b) ? 2) -a*-b+-c -(a*(-b))+ (-c) ?
Engenharia Informtica Linguagens de Programao 2002/2003
Pg. 3
1. Introduo
(cont.)
Semntica das expresses significado de cada operao e operando numa expresso, tendo em ateno a ordem pela qual as operaes so executadas e suas afectaes. Operandos e operadores:
Pg. 4
2. Expresses aritmticas
Expresses Aritmticas:
A avaliao de expresses aritmticas foi uma das principais motivao para o desenvolvimento da primeira linguagem de programao de alto nvel; Expresses aritmticas consistem de operadores, operandos, parnteses e invocaes de funes.
Pg. 5
2. Expresses aritmticas
(cont.)
Questes de projecto:
Quais so as regras de prioridade de operadores? Quais as regras de associatividade dos operadores? Qual a ordem de avaliao dos operandos? Existem restries nos efeitos colaterais da avaliao dos operandos? A linguagem permite definio de sobrecarga de operadores pelo programador? Que modos mistos (em termos de operadores) existem para expresses?
Engenharia Informtica Linguagens de Programao 2002/2003
Pg. 6
2. Expresses aritmticas
(cont.)
Tipos de Operadores:
Unrio - possui apenas um operando; Binrio - possui dois operandos; Ternrio - possui trs operandos;
Regras de precedncia dos operadores definem a ordem pela qual os operadores adjacentes, de diferentes precedncias, so avaliados. (Adjacentes - separados no mximo por um operando).
Engenharia Informtica Linguagens de Programao 2002/2003
Pg. 7
2. Expresses aritmticas
(cont.)
Regra de associatividade de operadores Define a ordem em que operadores adjacentes, com o mesmo nvel de precedncia, so avaliados.
Engenharia Informtica Linguagens de Programao 2002/2003
Pg. 8
2. Expresses aritmticas
(cont.)
Da esquerda para a direita, excepto **, que da direita para a esquerda; Alguns operadores unrios associam-se da direita para esquerda (Ex. FORTRAN); APL diferente - todos operadores possuem igual precedncia e todos so associados da direita para esquerda; Precedncia e associatividade podem ser alteradas atravs da utilizao de parnteses.
Engenharia Informtica Linguagens de Programao 2002/2003
Pg. 9
2. Expresses aritmticas
(cont.)
Variveis: necessrio obter o seu valor; Constantes: algumas vezes necessrio busc-las memria; algumas vezes esta encontra-se na prpria instruo mquina. Expresses com parnteses: avaliar-se primeiro todos os operandos e operadores dentro dos parnteses. Referncia a funes: caso muito importante! A ordem de avaliao fundamental.
Engenharia Informtica Linguagens de Programao 2002/2003
Pg. 10
2. Expresses aritmticas
(cont.)
Efeito colateral de funes - quando uma funo altera um parmetro de E/S ou uma varivel no local. O problema do Efeito Colateral de funes :
Como avaliar os operandos de uma expresso quando uma funo referenciada altera outro operando da expresso ex. seu parmetro. a = 10; b = a + fun(&a); /* Assumindo que fun retorna o parmetro divido por 2 e modifica o parmetro para o valor 20 */ Valor de b: 15 se a for avaliado primeiro 25 se fun for avaliado primeiro
Pg. 11
2. Expresses aritmticas
(cont.)
I) Escrever a definio da linguagem para no permitir efeitos colaterais de funes: Funes sem parmetros de entrada/sada; Permitir somente referncias locais em funes; Vantagem: Funciona!! Desvantagem: Programadores querem a flexibilidade de parmetros de entrada/sada. II) Escrever a definio da linguagem exigindo a avaliao dos operandos em ordem fixa. Desvantagem: limita algumas optimizaes do compilador.
Engenharia Informtica Linguagens de Programao 2002/2003
Pg. 12
2. Expresses aritmticas
(cont.)
Expresses Condicionais
average = (count == 0) ? 0 : sum / count; equivalente a: if(count==0) { average = 0; } else { average = sum / count; }
Engenharia Informtica Linguagens de Programao 2002/2003
Pg. 13
3. Sobrecarga de Operadores
Sobrecarga de Operadores
Comum para alguns (ex.: '/' para int e float) Alguns problemas potenciais: Ex. C: '*' //multiplicao ou desreferncia? Ex. C: result = * soma; // desreferncia ou falta de operando? Ex. C: media = soma / cont; // diviso '/ inteira ou real? Estes problema pode ser evitado pela introduo de novos smbolos (Ex. Pascal: result := soma div cont;)
Engenharia Informtica Linguagens de Programao 2002/2003
Pg. 14
3. Sobrecarga Operadores
(cont.)
Problema potencial:
Programadores podem definir sobrecarga de operadores sem sentido; Legibilidade pode ficar comprometida. A sobrecarga de operadores foi um dos recursos do C++ no copiado para o Java.
Pg. 15
4. Converso de Tipos
Converso de tipos:
Converso de estreitamento - converte um objecto para um tipo que no inclui todos os valores do tipo original (ex.: double para int). Converso de alargamento converte um objecto para um tipo que inclui pelo menos aproximaes para todos os valores do tipo original (int para double). Expresso de modo misto expresso que inclui operandos de vrios tipos diferentes.
Engenharia Informtica Linguagens de Programao 2002/2003
Pg. 16
4. Converso de Tipos
(cont.)
Desvantagem de coeres:
Diminuem a capacidade de deteco de erro por parte do compilador. Na maioria das linguagens todos os tipos numricos permitem coeso em expresses, usando converso de alargamento. Modula-2 e Ada no permitem coeso de tipos em expresses.
Pg. 17
4. Converso de Tipos
(cont.)
Ex. em Ada: FLOAT(INDEX) -- INDEX is INTEGER type Ex. em C: (int) speed /* speed is float type */
Pg. 18
4. Converso de Tipos
(cont.)
Ex. Diviso por zero Ex. overflow de inteiros overflow, underflow de virgula flutuante
Vrios erros somente so detectados em tempo de execuo e caso a linguagem no possua tratamento de excepes haver um final anormal do programa.
Engenharia Informtica Linguagens de Programao 2002/2003
Pg. 19
5. Expresses Relacionais
Expresses Relacionais
Expresso composta por um operador relacional e dois operandos de vrios tipos. As expresses so avaliada para alguma representao lgica (resultado booleano); Os smbolo dos operadores relacionais variam entre as diversas linguagens. Ex.: !=, /=, .NE., <>, #
Engenharia Informtica Linguagens de Programao 2002/2003
Pg. 20
10
Expresses Lgicas
C no possui tipo lgico utiliza o tipo int com 0 para FALSO e diferente de zero para VERDADEIRO. Em C a expresso: a < b < c correcta e equivalente a: (a<b) < c
Engenharia Informtica Linguagens de Programao 2002/2003
Pg. 21
Ada:
Pg. 22
11
Precedncias em C++
Symbol Name Name or Meaning ++ -() [] -> . ++ -! ~ Post-increment Post-decrement Function call Array element Pointer to structure member Structure or union member Pre-increment Pre-decrement Logical NOT Bitwise NOT Unary minus
Engenharia Informtica Linguagens de Programao 2002/2003
Highest Precedence
Right to left
Pg. 23
Precedncias em C++
Symbol Name Name or Meaning + & * sizeof new delete (type) .* ->* * / Unary plus Address Indirection Size in bytes Allocate program memory Deallocate program memory Type cast ex. (float) i Pointer to member (objects) Pointer to member (pointers) Multiply Divide
Engenharia Informtica Linguagens de Programao 2002/2003
(cont.)
Associativity
Highest Precedence
Left to right
Pg. 24
12
Precedncias em C++
Symbol Name Name or Meaning % + << >> < <= > >= == != Remainder Add Subtract Left shift Right shift Less than Less than or equal to Greater than Greater than or equal to Equal Not equal
Engenharia Informtica Linguagens de Programao 2002/2003
(cont.)
Highest
Left to right Precedence
Left to right
Pg. 25
Precedncias em C++
Symbol Name & ^ | && || ?: = Name or Meaning Bitwise AND Bitwise exclusive OR Bitwise OR Logical AND Logical OR Conditional Assignment
(cont.)
Associativity Left to right Left to right Left to right Left to right Left to right Right to left Right to left
*=, /=, %=, +=, - Compound assignment =, <<=, >>=, &=, ^=, |= , Comma
Engenharia Informtica Linguagens de Programao 2002/2003
Highest Precedence
Left to right
Pg. 26
13
6. Avaliao Curto-circuito
Avaliao Curto-circuito uma expresso que tem um resultado determinado sem avaliar todos os seus operandos.
Ex. C: if(a>0 && b<50) //se a<0 --> b<50 no avaliado.
Problema de avaliao curto-circuito: utilizao intensa da tabela de smbolos do compilador. Avaliao curto-circuito expe o potencial problema de efeito colateral em expresses
Engenharia Informtica Linguagens de Programao 2002/2003
6. Avaliao Curto-circuito
(cont.)
C, C++, e Java: utilizam avaliao curto-circuito para operadores booleanos (&& e ||), e no curto-circuito para operaes de bit (& e |) Ada: programadores podem especificar o modo da avaliao. Pascal: no utiliza avaliao curto-circuito. FORTRAN 77: possui curto-circuito mas efeitos colaterais so deixados em estado indefinido.
Pg. 28
14
7. Instrues de atribuies
Instrues de atribuio mecanismo que permite modificar dinamicamente as vinculaes de valores a variveis. Operador de atribuio:
FORTRAN, BASIC, PL/I, C, C++, Java --> '=' ALGOLs, Pascal, Modula-2, Ada --> ':='
'=' ruim se possui sobrecarga com operador relacional de igualdade. Ex. PL/I: A=B=C; //igualdade ou atribuio?
Pg. 29
7. Instrues atribuies
(cont.)
Pg. 30
15
7. Instrues atribuies
(cont.)
Pg. 31
7. Instrues atribuies
(cont.)
Em C, C++, Java, o comando de atribuio produz um resultado, portanto, pode ser utilizado como um operador em expresses. Ex.: while ((ch = getchar() != EOF) { ... } Desvantagem:
Pg. 32
16
Pg. 33
(cont.)
Em Java somente atribuio com converso de alargamento realizada. Ex. em Java: int x = 10; double y = x; // O.K. x = y; // invlido Em Ada no existe atribuio com coeso.
Pg. 34
17