Upload
raphaella-maria-alves
View
219
Download
0
Embed Size (px)
DESCRIPTION
operadores
Citation preview
Tipos e operadores Alexandre Mota [email protected]
Tipo de dado
Um tipo de dado no nada demais formado por dois elementos:
Um conjunto de valores Operadores que podem ser usados para
manipular tais valores
Em nosso dia-a-dia, ns os usamos to rotineiramente que nem percebemos
Por exemplo, em 2 + 3, quem o conjunto e quem o operador?
Tipos de dados FINITOS
Diferente do mundo da Matemtica Em Computao os dados precisam ser
armazenveis na memria do computador Como a memria finita, ento os dados
precisam ser finitos Na aula anterior vimos que o tipo char
varia entre -128 e 127 Pergunta: que acontece se somarmos 1 a
127? Vamos ver a resposta a seguir
Aritmtica binria
Os nmeros binrios (relacionado a bits) so o 0 e o 1
Na adio temos: 0 + 0 = 0 0 + 1 = 1 + 0 = 1 1 + 1 = 10
Sem entrar em detalhes, note que 10 binrio corresponde a nosso 2 decimal. Nada mais natural
Aritmtica binria O nmero decimal 127 representado
em formato binrio como 1111111 Ou seja, 7 bits ligados Mas como char possui 1 byte de
armazenamento, temos um oitavo bit Logo, 127(10) = 01111111(2) Fazendo a soma
01111111(2) + 00000001(2), obtemos: 10000000(2) = -128(10)
Portanto, todo cuidado pouco na linguagem C. Em outras linguagens, obteramos uma mensagem de erro: overflow
Operadores tradicionais Os tipos de dados char, int, float e double
aceitam os operadores aritmticos tradicionais: +, -, * (multiplicao) e /
Desta forma, pode haver mistura entre tipos. Por exemplo: 2 + 3.5
O 2 seria inteiro e o 3.5 um ponto-flutuante
H uma srie de regras a seguir nos clculos, mas a mais simples : o resultado o de maior tipo
Mistura entre tipos
Suponha o clculo: 2 + 3.0 / 5 Como a diviso deve ser executada antes (diz-se maior precedncia) da adio, temos:
2 + 0.6 ===> 2.6 (Res. Final) Ento, 3.0 (ponto-flutuante) fez 5 (inteiro) se tornar ponto-flutuante (0.6) uma forma de propagao do maior tipo. Isto em relao com a forma de armazenamento
Curiosamente
Seja agora a seguinte expresso 2 + 3 / 5 Aparentemente a mesma expresso
anterior, mas no ! O fato de termos agora 3 e no 3.0 muda
o clculo Como / comum a inteiros e reais, a
linguagem C interpreta / diferentemente, dependendo dos tipos envolvidos!!!
2 + 3 / 5 = 2 + 0 = 2 (inteiro)
Operadores novos
Em C, h os operadores ++ e -- So operadores unrios (ou seja, s
possuem um valor associado) Apenas variveis podem us-los Suponha que x = 2. Ento x++ == 3 Para x = 0,
x-- (ou --x) == -1 e ++x (ou x++) == 1
Operadores novos e atribuio
Os operadores ++ e -- possuem relao com o comando de atribuio
x++ x = x + 1
x-- x = x - 1
e
Antes/aps varivel Em ++x ou x++, tanto faz Mas 1 + (++x) no o mesmo que 1 + (x++) Suponha x = 0 Em 1 + (++x), temos 2 como resultado J em 1 + (x++), obtemos 1 como resultado Apesar de que x passa a ser 1 independente
de termos usado ++x ou x++
Resto da diviso Quando aprendemos Matemtica (bsica),
ensinam-nos o seguinte clculo:
Em C, o 1 obtido por 13 % 3 O 4 seria o usual 13 / 3 Portanto, na diviso inteira, o resto um
operador muito importante!
13 3 1 4
Expresses e parntesis
Na Matemtica aprendemos a calcular expresses contendo (), [] e {}
Em C, usamos apenas () para capturar [] e {}
Como isto possvel? Simples! Basta resolvermos os ()s mais
internos primeiro at chegarmos aos mais externos
Precedncia e parntesis De forma equivalente Matemtica, em C
os ()s alteram a precedncia/ordem de clculos
Compare: 1 + 2 / 3 (1 + 2) / 3 1 + (2 / 3)
Quando ()s no so usados, apenas as precedncias pr-definidas resolvem a ordem
Algumas precedncias
Operador Nome Precedncia - Inverso sinal 1a ++ Incremento 1a -- Decremento 1a * Multiplicao 2a / Diviso 2a % Resto 2a + Adio 3a - Subtrao 3a
Avaliando uma expresso
Suponha que answer, sum, MAX e lowest sejam identificadores vlidos
Em que ordem o compilador de C avaliaria o seguinte comando?
answer = sum / 4 + MAX * lowest; (A) Em 1o lugar, calcula-se sum / 4; (B) Em 2o lugar, MAX * lowest; (C) Em 3o lugar, adiciona-se (A) a (B); (C) Em 4o lugar, armazena (C) em
answer;
Conciso ou complicao?
Vimos antes que x++ era o mesmo que x = x + 1
Mas este formato no to flexvel Ento C introduziu operadores
conjugados com atribuio Por exemplo, compare:
com x += 1 x++ ++x x = x + 1
x += 2 x = x + 2
Atribuies concisas
x += b x = x + b x -= b x = x b x *= b x = x * b x /= b x = x / b x %= b x = x % b
Verso combinada
Verso estendida
Promoo de tipos
Em 2 + 3 / 5, no obtemos o resultado usual porque 3 / 5 assume a diviso entre inteiros que resulta em 0
Tivemos que fazer 2 + 3.0 / 5 para obter o resultado usual
Mas tambm podemos fazer atravs de promoo de tipos: 2 + ((float) 3) / 5
O termo (float) 3 cria o 3.0 Mais til quando usado com variveis
Restrio de tipos
O operador cast tambm pode ser usado para restringir um tipo
Por exemplo: forar um float a se tornar um int, ou um int a se tornar um char, etc.
O perigo est na potencial perda de informao
Portanto, cuidado redobrado ao tentar fazer tais converses
Operadores relacionais
Da Matemtica j usamos rotineiramente tais operadores: >,
Operadores relacionais
Tais operadores so binrios (comparam 2 valores) e requerem que seus argumentos sejam do mesmo tipo
Assim, antes do compilador comparar, faz-se uma promoo para o maior tipo
Portanto, por exemplo: Em int
Operadores lgicos
Em nossa linguagem usual, usamos os operadores lgicos e nem percebemos
Vejamos um exemplo simples Paulo: - Oi Ana, voc vai ao cinema tera? Ana: - Oi Paulo, irei se o filme X j estiver
em cartaz e no tivermos prova na quarta As frases o filme X j estiver em cartaz,
no tivermos prova na quarta possuem um valor associado
Operadores lgicos
Tais valores podem ser verdadeiros (o que Ana deseja) ou falsos (Ana no deseja)
Para que Ana v ao cinema preciso que ambos os valores sejam verdadeiros
Caso um deles seja falso, ela desiste de ir ao cinema
O operador lgico em questo o E (ou AND do Ingls)
Operadores lgicos
Basicamente temos 3 operadores lgicos
Operador Em C E && OU || NO !
Avaliando operadores lgicos
Operador de conjuno && (E)
Falso && Falso Falso
Falso && Verdadeiro Falso
Verdadeiro && Falso Falso
Verdadeiro && Verdadeiro Verdadeiro
Avaliando operadores lgicos
Operador de disjuno || (OU)
Falso || Falso Falso
Falso || Verdadeiro Verdadeiro
Verdadeiro || Falso Verdadeiro
Verdadeiro || Verdadeiro Verdadeiro
Avaliando operadores lgicos
Operador de negao ! (NO)
! Falso Verdadeiro
! Verdadeiro Falso
Operadores de baixo nvel
As vezes importante manipular os bits que compem um dado
Para fazer isto, usamos os operadores de bits
So semelhantes aos operadores lgicos, exceto por aplicarem as regras lgicas nos bits e no no valor final resultante
Operadores sobre bits Operador Significado
& E em bits
| OU em bits
^ OU exclusivo em bits
~ Complemento
> Girar direita
Operador & Bit_1 Bit_2 Bit_1 & Bit_2
0 0 0
0 1 0
1 0 0
1 1 1
Operador | Bit_1 Bit_2 Bit_1 | Bit_2
0 0 0
0 1 1
1 0 1
1 1 1
Operador ^ Bit_1 Bit_2 Bit_1 ^ Bit_2
0 0 0
0 1 1
1 0 1
1 1 0
Operador ~
Bit ~ Bit
0 1
1 0
Operador semelhante, s que gira para a direita
Tipos de dados e leitura
J vimos que leitura se faz com o comando scanf(%M, &var)
Onde M o modo (relacionado ao tipo) e var nome de uma varivel
O operador & ser explicado posteriormente
Por enquanto, basta lembrar que ele deve estar a sempre (com apenas 1 exceo)
Tipos de dados e leitura
Sequncia Objetivo %c Ler um nico caractere %d Ler um nmero inteiro %u Ler um inteiro sem sinal %l Ler um inteiro longo %f %e %g Ler um nmero real (float) %lf %le %lg Ler um nmero real (double) %s Ler uma sequncia de
caracteres
Tipos de dados e sada
Da mesma forma que o comando scanf consegue capturar os dados do teclado e guard-los em variveis
O reverso (mostrar dados na tela) obtido com o comando printf
Tal qual o comando scanf, o comando printf tambm usa as seqncias de apresentao associadas aos tipos
Tipos de dados e sada Sequncia Objetivo %c Mostra nico caractere %d Mostra nmero inteiro %u Mostra inteiro sem sinal %l Mostra inteiro longo %f Mostra real (pto flutuante) %e, %E Mostra real (notao cientf.) %g, %G Escolhe %e ou %f (o menor) %s Mostra seq. caracteres %% Mostra caractere %
Formatando a sada
Se executarmos o comando printf(%f, 2.5);
Obteremos 2.500000 Se quisermos obter simplesmente 2.50,
por exemplo, precisamos usar printf(%.2f, 2.5);
E se antes do . colocarmos um nmero, este ser o tamanho mximo da parte inteira
Formatando a sada
J com inteiros, usamos apenas printf(%Nd, val);
Onde N o tamanho mximo ocupado pelo valor armazenado em val
Em caso de val no ocupar todo o tamanho de N, espaos em branco so colocados esquerda printf(%3d, 2); resulta em 2
Formatando a sada
Se colocarmos o nmero N precedido por um 0 (zero), ento 0s sero usados no lugar dos espaos em branco
Em printf(%03d, 2); temos como resultado 002
Tipos e operadores Alexandre Mota [email protected]