You are on page 1of 17

Linguagens de Programao

Captulo VI Expresses e Instrues de Atribuio


Baseado em Conceitos de Linguagens de Programao 4 Edio Robert W. Sebesta Bookman

Engenharia Informtica Linguagens de Programao 2002/2003

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:

Engenharia Informtica Linguagens de Programao 2002/2003

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.

Engenharia Informtica Linguagens de Programao 2002/2003

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.)

Nveis de precedncia tpicos:


Parnteses Operadores unrios ** (se a linguagem suportar a exponenciao) *, / +, -

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.)

Regras de associatividade tpicas:

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.)

Ordem de avaliao de operandos:


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

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 11

2. Expresses aritmticas

(cont.)

Duas possveis solues:

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

Ex. em C, C++, e Java (?:)

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.)

C++ e Ada permitem que programador defina a sobrecarga de operadores.

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.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 15

4. Converso de Tipos

Converso de tipos:

Efectuada de forma implcita coero (Coercion) Efectuada de forma explicita (cast)

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.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 17

4. Converso de Tipos

(cont.)

Converso Explcita ("cast"): Converso dada por uma instruo.

Ex. em Ada: FLOAT(INDEX) -- INDEX is INTEGER type Ex. em C: (int) speed /* speed is float type */

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 18

4. Converso de Tipos

(cont.)

Erros em Expresses (causados por):


Limitaes aritmticas:

Ex. Diviso por zero Ex. overflow de inteiros overflow, underflow de virgula flutuante

Limitaes da aritmtica do computador:

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

Expresses Lgicas (Booleanas)


Operandos so lgicos e resultado lgico. Operadores: FORTRAN 77 Fortran 90 C Ada


.AND. .OR. .NOT. and or not && || ! and or not xor

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

Precedncia dos operadores


Precedncia dos operadores: Pascal:


Ada:

not, - unrio *, /, div, mod, and +, -, or Highest relops Precedence

C, C++, e Java possuem mais de 50 operadores

** *, /, mod, rem - unrio , not +, -, & relops and, or, xor


Engenharia Informtica Linguagens de Programao 2002/2003

+ de 17 nveis diferente de precedncias

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

Associativity Left to right

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.)

Associativity Left to right Left to right

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

Ex. C: (a > b) || (b++ / 3) // pode no ser executado


Pg. 27

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.

Engenharia Informtica Linguagens de Programao 2002/2003

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?

C, C++ no possui este problema


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 29

7. Instrues atribuies

(cont.)

Atribuio mais Complexa:


Alvos mltiplos Ex. em PL/I: A, B = 10 Alvos condicionais Ex. em C, C++ e Java: (first = true) ? total : subtotal = 0 equivalente a: if(first=true) total=0 else subtotal=0 Operador de atribuio composto - atribuio com operao Ex. em C, C++ e Java: sum += next; /* sum = sum + next */

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 30

15

7. Instrues atribuies

(cont.)

Atribuio mais Complexa (cont.):


Operadores de atribuio unrios Ex. em C, C++ e Java: a++; /* a = a+1 */ Operador aritmtico binrio '=' Ex. em C, C++ e Java: a = b * (c = d * 2 + 1) + 1; // equivalente a: c = d * 2; a = b * (c + 1) +1;

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 31

7. Instrues atribuies

(cont.)

Atribuio como uma Expresso

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:

Outro tipo de efeito colateral em expresses.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 32

16

8. Atribuio de Modo Misto

Atribuio de Modo Misto:


Em FORTRAN, C/C++ qualquer valor numrico pode ser atribudo a qualquer varivel escalar. Converso necessria ser efectuada. Ex. C: int x = 10: double y = x; // converso de int para double Em Pascal inteiros podem ser atribudos a reais mas, reais no podem ser atribudos a inteiros.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 33

Atribuio de Modo Misto

(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.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 34

17

You might also like