03 Tipos e Operadores

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]