Você está na página 1de 43

Tipos e operadores

Alexandre Mota
acm@cin.ufpe.br

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
Portanto,
todoligados
cuidado pouco
linguagem
C. Em outras
Mas na
como
char possui
1 byte de
linguagens, obteramos
umaoitavo bit
armazenamento,
temos um
mensagem de erro: overflow
Logo, 127(10) = 01111111(2)
Fazendo a soma
01111111(2) + 00000001(2), obtemos:
10000000(2) = -128(10)

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 pontoflutuante
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
e

x--

x=x-1

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:

13
1
Em

3
4

C, o 1 obtido por 13 % 3
O 4 seria o usual 13 / 3
Portanto, na diviso inteira, o resto um
operador muito importante!

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
Inverso sinal
Incremento
Decremento
Multiplicao
Diviso
Resto
Adio
Subtrao

Precedncia
1a
1a
1a
2a
2a
2a
3a
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:
x += 1
x++
++x
x=x+1
com
x += 2
x=x+2

Atribuies concisas
Verso
combinada
x += b
x -= b
x *= b
x /= b
x %= b

Verso
estendida
x=x+b
x=xb
x=x*b
x=x/b
x=x%b

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:
>, <, =, , , e

Em

C, como em praticamente todas as


linguagens de programao, no usamos
caracteres especiais no cdigo
Desta forma, temos as seguintes
representaes: <= (), >= (), e != ()

Operadores relacionais
Tais

operadores so binrios (comparam


2 valores) e requerem que seus
argumentos sejam do mesmo tipo
Assim, antes do compilador comparar, fazse uma promoo para o maior tipo
Portanto, por exemplo:
Em int <= float,
Primeiro obtm-se float <= float e
Em seguida, faz-se a comparao <=

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

Operador
E
OU
NO

temos 3 operadores lgicos


Em C
&&
||
!

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 esquerda

>>

Girar direita

Operador &
Bit_1

Bit_2

Bit_1 & Bit_2

Operador |
Bit_1

Bit_2

Bit_1 | Bit_2

Operador ^
Bit_1

Bit_2

Bit_1 ^ Bit_2

Operador ~
Bit

~ Bit

Operador <<
Seq. bits (s)

s << n

00011100

00111000

00011100

11000001

Obs.: O 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
%c
%d
%u
%l
%f %e %g
%lf %le %lg
%s

Objetivo
Ler um nico caractere
Ler um nmero inteiro
Ler um inteiro sem sinal
Ler um inteiro longo
Ler um nmero real (float)
Ler um nmero real (double)
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
%c
%d
%u
%l
%f
%e, %E
%g, %G
%s
%%

Objetivo
Mostra nico caractere
Mostra nmero inteiro
Mostra inteiro sem sinal
Mostra inteiro longo
Mostra real (pto flutuante)
Mostra real (notao cientf.)
Escolhe %e ou %f (o menor)
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

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
acm@cin.ufpe.br

Você também pode gostar