Programação
MEAer
Bertinho Andrade da Costa
2011/2012
1º Semestre
Instituto Superior Técnico
Expressões e Instruções
Programação 2011/2012 DEEC-IST
Expressões
1
Sumário
Expressões
Formato
Expressões de atribuição
Availação de expressões
Efeitos laterais
Conversão de tipos, implícita e explícita
Instruções
Instrução de expressão
Instrução composta
...
Programação 2011/2012 DEEC-IST
Expressões
2
Expressões
Uma expressão é uma sequência de operandos e operados que
ao ser avaliada se reduz a um valor.
Um operador é representado por um conjunto de símbolos da
linguagem e indica a realização de uma acção.
Um operando é o elemento que sofre a acção de um operador.
A linguagem de programação C implementa 7 formatos
diferentes de expressões:
Primária - Contém um operando e nenhum operandor: INT_MAX PI a
123.45
Postfix, exemplo: a++
Unária, exemplo: -b
Binária, exemplo: a % b
Ternária
Atribuição, exemplo: a = b + c
Vírgula (Comma)
Programação 2011/2012 DEEC-IST
Expressões
3
Formato de Expressões
Exp. Primária ->
Identificador, constante, ou expressão entre parêntesis
Exp. Postfix ->
Exp. Unária ->
Operador
Exp. Binária ->
Expressão unária
Exp. Ternária ->
Exp. binária
Exp. Atribuição ->
Variável
Exp. vírgula (Comma) ->
Programação 2011/2012 DEEC-IST
Operador
Expressão primária
Expressão postfix
Operador
Operador
Operador
Expressão
Expressão
Operador
Expressão
Expressão
Operador
Expressões
Expressão unária
Expressão
4
Expressões de atribuição
A expressão de atrbuição avalia a
expressão do lado direito do operador =
e guarda o valor na variável do lado
esquerdo do =.
A expressão de atribuição tem um valor
e um efeito lateral
O valor da expressão é o valor da
expressão do lado direito do
operador =.
O efeito lateral consiste na
colocação do valor da expressão no
operando do lado direito do
operador de atribuição.
Após a atribuição do valor, o valor
anterior da variável é perdido.
Exemplos
int x = 5;
int w = 4;
/* Para colocar o valor de x
em w */
w = x
/* Incrementar w de 1 */
w = w + 1
Atenção: Não confundir o operador =
atribuição, com o operador relacional
igual que é representado por ==
/* Decrementar w de 20 */
w = w - 20
/* Valor de w = ? */
Programação 2011/2012 DEEC-IST
Expressões
5
Expressões de atribuição
O operador de atribuição =, é um operador
infix (operador é colocado entre os
operandos) binário cujo resultado é o valor
que é atribuido ao operando da esquerda.
O ponto e vírgula ; é o terminador da
expressão e tem como acção eliminar o
valor que é produzido pela expressão.
Exemplos:
Exemplo
x=x+6
Supondo que a variável x tem o valor 3, a
expressão x + 6 é avaliada e produz o
resultado de 9. O valor 9 é atribuido à
variável x, o que faz alterar o seu valor de 3
para 9. Após o que o operador = gera o
valor 9. Este último valor pode ser
ignorado, ou ser utilizado.
/* Qual é o resultado de*/
w = (x = 4) / (y = 5)
a = (b + 5 = (c = 11)) /*?*/
Considere a expressão de atribuição em
cadeia w = y = t = 3; , ela é avaliada da
direita para a esquerda w = (y = (t = 3)); as
variáveis t, y e w ficam com o mesmo valor.
Programação 2011/2012 DEEC-IST
Expressões
6
Expressões de atribuição
Em C é frequente serem utilizadas expressões de
atribuição com incremento ou decremento de uma
unidade
x = x + 1
y = y - 1
Estas expressões podem ser escritas de forma
condensada utilizando os operadores unários de
incremento (++) e de decremento (--) . Podem obter-se
o mesmo resultado com
++x /* operador de incremento prefix */
x++ /* operador de incremento postfix */
--y /* operador de decremento prefix */
y-- /* operador de decremento postfix */
Mas caso sejam utilizandos em expressões de
atribuição então é necessário ter cuidado:
Programação 2011/2012 DEEC-IST
Expressões
soma = ++x
/* É equivalente a */
x = x + 1
soma = x
/* enquanto que */
soma = x++
/* É equivalente a */
soma = x
x = x + 1
No final da execução da
expressão a variável x fica sempre
com o mesmo valor. A variável
soma é que pode ficar com valor
diferente, o qual depende do tipo
de operação se prefix se postfix.
7
Expressões de atribuição
Há ainda operadores de atribuição para
os casos em que as expressões
assumem a forma de
variável = variável operador expressão
As expressões podem ser escritas na
forma
variável operador= expressão
Exemplos:
x += 5
/* x = x + 5; */
y -= 10
/* y = y - 10; */
z *= cos(a) /* z = z * cos(a)
*/
Operador
Prioridade na
avaliação
= += -= *=
/= %= <<= >>=
&= ^= |=
1º
2º
3º
ATENÇÃO: Os operadores <<=, >>=,
&= |=, ^= operam sobre bits
Exemplo:
char x =0xff;
x &= 0x01;
Programação 2011/2012 DEEC-IST
Expressões
8
Avaliação de Expressões
Na avaliação de expressões são utilizados dois princípios:
Precedência (ou prioridade):
É utilizada para determinar a ordem de avaliação dos DIFERENTES
operadores num expressão complexa.
Associatividade:
É utilizada para avaliar os operadores com igual grau de precedência.
Associação à esquerda - Avaliação da esquerda para a direita
2*3/4%5*6 <=> ((((2*3)/4)%5)*6)
Associação à direita - Avaliação da direita para a esquerda
a+=b*=c-=4 <=> (a+=(b*=(c-=4)))
<=> (a = a +(b = b * (c = c - 4)))
Para alterar a ordem de avaliação das expressões devem ser
utilizados parêntesis curvos ()
Programação 2011/2012 DEEC-IST
Expressões
9
Expressões e efeitos laterais
Um efeito lateral (“side effect”) é uma acção que resulta da
avaliação de uma expressão.
Exemplo I: x = 3
A expressão tem três partes
A primeira, à direita do operador de atribuição, há uma expressão primária
que tem o valor 3.
A segunda , a expressão total (x=3) também tem o valor 3.
A terceira, o efeito lateral, a variável x recebe o valor 3.
Exemplo II: x = x + 3
Suponha-se que x inicialmente tem o valor 3
A expressão do lado direito do operador igual tem o valor 6
A expressão de atribuição (toda) tem o valor 6.
O efeito lateral consiste na alteração do valor da variável x que passa a ter
o valor 6
Programação 2011/2012 DEEC-IST
Expressões
10
Expressões e efeitos laterais
Na linguagem C existem 6 efeitos laterais diferentes,
4 pré-efeitos: Incremento e decremento prefixo unários (++a, --a),
chamada a uma função e a atribuição. Os efeitos laterais dessas
expressões têm efeito antes da avaliação da expressão
2 pós-efeitos: Incremento e decremento postfix (a++, a--). Os efeitos
laterais têm efeito após a expressão ter sido avaliada.
Aviso: Em Ansi C , se numa expressão há uma variável que é
modificada mais do que uma vez o resultado é indefinido.
Exemplo: (a++ - a++)
Programação 2011/2012 DEEC-IST
Expressões
11
Expressões e Tokens
Tabela com os elementos lexicais da linguagem C
Token
Operador
Classe
Precedência
Associação
Nomes, literais
Elementos lexicais simples
Primária
16
n/a
a[k]
f(...)
Indexação
Chamada a uma função
Postfix
Postfix
16
16
Esq. para Direita
Esq. para Direita
.
Selecção directa
Postfix
16
Esq. para Direita
->
Selecção inderecta
Postfix
16
Esq. para Direita
++ --
Incremento decremento
Postfix
16
Esq. para Direita
++ --
Incremento decremento
Prefixo
15
Dir. para a Esq.
sizeof
Dimensão
Unária
15
Dir. para a Esq.
~
Bitwise not
Unária
15
Dir. para a Esq.
!
Negação lógica
Unária
15
Dir. para a Esq.
- +
Simético e sinal de +
Unária
15
Dir. para a Esq.
&
Endereço de
Unária
15
Dir. para a Esq.
*
Indirecção
Unária
15
Dir. para a Esq.
( tipo )
Casts
Unária
14
Dir. para a Esq.
* / %
Multiplicativos
Binária
13
Esq. para Direita
+ -
Aditivos
Binária
12
Esq. para Direita
Programação 2011/2012 DEEC-IST
Expressões
12
Expressões e Tokens
Tabela com os elementos lexicais da linguagem C (cont.)
Token
Operador
Classe
Precedência
Associação
<< >>
Binária
11
Esq. para Direita
< > <= >=
== !=
Deslocamento à esquerda e à
direita
Relacional
Igualdade, desigualdade
Binária
Binária
10
9
Esq. para Direita
Esq. para Direita
&
Bitwise and
Binária
8
Esq. para Direita
^
Bitwise xor
Binária
7
Esq. para Direita
|
Bitwise or
Binária
6
Esq. para Direita
&&
E lógico
Binária
5
Esq. para Direita
||
Ou lógico
Binária
4
Esq. para Direita
? :
Condicional
Ternária
3
Dir. para a Esq.
= += -= *=
/= %= <<= >>=
&= ^= |=
,
Atribuição
Binária
2
Dir. para a Esq.
Avaliação sequêncial
Binária
1
Esq. para Direita
Programação 2011/2012 DEEC-IST
Expressões
13
Expressões com tipos mistos
Até este momento admitiu-se que os operandos numa
expressão têm todos o mesmo tipo.
Que acontece se numa expressão numérica os operandos tiverem tipos diferentes?
Por exemplo inteiros e reais? A representação interna (num computador) de um inteiro é
diferente da de um real
Regras:
char
Numa expressão de atribuição , o valor final da expressão tem que ser do
mesmo tipo que o operando do lado esquerdo do operador de atribuição.
Em C, é realizada a conversão de um tipo para o formato apropriado de
modo que a expressão possa ser avaliada. Neste caso a conversão é
implícita.
A regra de conversão segue a representação seguinte:
short
int
Programação 2011/2012 DEEC-IST
unsigned int
long int
unsigned long int
float
double
long double
Hierarquia de Promoção
Expressões
14
Expressões com tipos mistos
Operações binárias com tipos numéricos diferentes:
O compilador promove (promoção automática) o operando de representação mais
limitada
Considere-se
z = x + y;
Operando 1
int
float
double
int
double
float
Operando 2 Conversão
int
não
float
não
double
não
float
op1 float
int
op2 double
double
op1 double
Resultado
int
float
double
float
double
double
Atribuição: O resultado da expressão é convertido ou truncado para o tipo da variável que está à
esquerda do operador atribuição
Programação 2011/2012 DEEC-IST
Expressões
15
Expressões com tipos mistos
Em vez de deixar que a conversão de tipos seja feita
automaticamente pelo compilador, o programador por instruir o
compilador a efectuar a conversão, neste caso, conversão explícita
de tipo. Para isso é necessário o operador de conversão (cast).
Exemplos:
(float) a
(int) b
(char) (a+b)
Suponha que a variável a é do tipo inteiro e que tem o valor 3.
Qual é o resultado de: (Consultar a tabela com os operadores)
(float) (a / 5)
(float) a / 5
Programação 2011/2012 DEEC-IST
Expressões
16
Expressões númericas
Uma função númerica quando utilizada numa expressão, é avaliada,
e o seu valor é utilizado no lugar onde está a função (nome e lista de
argumentos).
Exemplo:
0.2 * exp(-2.0 * x) + 2 / 3.0 + 5.0
O C disponibiliza diversas bibliotecas com funções. Dessas destaca-se a
bliblioteca matemática. A utilização de funções matemáticas implica:
A utilização da directiva #include <math.h>
No processo de “linkagem” é necessário especificar a biblioteca (matemática)
que contém o código das funções
gcc -g -Wall -ansi -pedantic -lm nomefic.c -o nomefic
Programação 2011/2012 DEEC-IST
Expressões
17
Expressões númericas
Lista de algumas funções de math.h
acos(x) - função inversa do coseno de x
cos(x) - coseno de x
cosh(x) - coseno hiperbólico de x
asin(x) - função inversa seno de x
sin(x) - seno de x
sinh(x) - seno hiperbólico de x
tan(x) - tangente de x
exp(x) - exponência de x
log(x) - logaritmo de x
log10(x) - logaritmo na base 10 de x
sqrt(x) - raiz quadrada de x
pow(x,y) - calcula o valor de x levantado a y
fabs(x) - calcula o valor absoluto de um real
Lista de algumas funções de stdlib.h que operam sobre inteiros
abs(n) - valor absoluto de n
labs(n) - Calcula o valor absoluto de um inteiro long
Programação 2011/2012 DEEC-IST
Expressões
18
Instruções
Uma instrução (“statement”) provoca a realização de uma acção, isso
pode ser traduzido numa ou mais instruções de computador.
Em C existem 6 tipos de instruções (de alto nível).
Instrução de expressão
Instrução composta
Instruções
Instrução de rótulo
Instrução de selecção
Instrução de iterativas / repetição
Instrução de salto
Programação 2011/2012 DEEC-IST
Expressões
19
Instrução de expressão
Uma expressão é transformada numa instrução colocando um ; no
fim da expressão.
Exemplo I: a = 1;
O efeito da expressão é guardar o valor 1 na variável a. O valor da expressão é o
valor 1. Após o valor ter sido guardado, a expressão é finalizada (devido ao ;) e o
valor da expressão é eliminado. O programa passa para a próxima instrução.
Exemplo II: a = b = 2;
A instrução é composta por duas expressões a=(b=2); A expressão em
parêntesis tem o efeito de atribuir o valor 2 à variavél b. O valor da expressão é 2.
Este valor é depois guardado na variável a. Como a expressão termina com o ; o
valor 2 é eliminado e o programa para para a instrução seguinte.
Programação 2011/2012 DEEC-IST
Expressões
20
Instrução de expressão
Exemplo III: aux = scanf (“%d”, &x);
Esta instrução tem dois efeitos laterais. O primeiro é procurar a função scanf de modo
a que seja lido um valor do teclado para coloca-lo na variável x (atenção ao endereço
da variável). O segundo efeito consiste em armazenar o valor de retorno da função, o
qual representa o número de valores que foram convertidos com sucesso, Neste caso
pode ser 1 (se sucesso), 0 ou EOF (se insucesso). O operador de atribuição permite
armazenar o valor na variável aux. A expressão termina com o ; e o valor de retorno da
função scanf é eliminado.
Exemplo IV: num_Char_no_Ecra = printf(“ Numero de caracteres”);
A função printf tem o efeito de apresentar no ecrã os caracteres que fazem parte da
string constante, e retorna um número correspondente ao número de caracteres que
foram escritos no ecrã. Normalmente não é necessário armazenar esse número e
como consequência a instrução é utilizada da forma seguinte
printf(“ Numero de caracteres”);
Exemplo V: Outras instruções que não são utilizadas mas que estão
sintaticamente correctas são:
b;
3;
Programação 2011/2012 DEEC-IST
;
Expressões
21
Instrução composta
Uma instrução composta consiste numa bloco (unidade) de código com
zero ou mais instruções que começa com { e termina com }
Numa instrução composta é obrigatório que o código com as
declarações e as definições esteja antes de qualquer instrução.
Note-se que a seguir à } não é necessário colocar o ponto e vírgula. Se
isso for feito o compilar considera que o ; corresponde a uma instrução
nula.
Exemplo:
{
/* definicoes locais */
int a, b = 1, c = 2;
/* Instrucoes */
a = ++b - c--;
}
Programação 2011/2012 DEEC-IST
Expressões
22
Problemas
Problema: Desenvolva um programa que efectua o cálculo do custo total de uma
encomenda. A encomenda é composta de diversos produtos. Considere que existem
somente 3 produtos base, A, B, C. O programa deve ler a quantidade dos produtos, os
preços unitários pA, pB; pC e o iva de cada produto, ivaA, ivaB, ivaC.
Resolução: ?
Problema: Um automobilista tem que realizar por dia um total de 60 km. Se o
automobilista sair de casa na hora de “ponta”, o automóvel gasta 8L de gasolina 95
aos 100Km, num terço do percurso, e no resto do percurso o automóvel gasta 15L por
cada 100Km. Mas se o automobilista sair de casa “fora” da hora de ponta então o
automóvel gasta 7L aos 100Km em dois terços do percurso e 9L aos 100Km no resto
do percurso. Quanto é que custa a viagem ao automobilista em ambas as situações?
Programação 2011/2012 DEEC-IST
Expressões
23