Unidade II - Tipos, Operadores e Expressões
Unidade II - Tipos, Operadores e Expressões
Unidade II - Tipos, Operadores e Expressões
#include <stdio.h>
ANSI C
int main ()
{
printf("Hello World!");
return 0;
}
Que assuntos serão abordados nesta unidade?
●
Organização de Computadores ●
Sistema de tipos do ANSI C
– visão geral – tipos primários
– modelo em níveis – declaração de constantes
– subsistema de memória – tipos derivados
– uso dos sistemas de tipos – tipos definidos no programa
– declaração de variáveis
●
Operadores e Expressões no ANSI C
– alocação de memória
alocação automática
– operadores
alocação dinâmica
– precedência de operadores
– variáveis em registradores
– ordem de avaliação
– conversão de tipos
– operações com strings
2/72
Estrutura básica de
um computador
3/72
Ciclo de Instrução
endereços
Unidade
Central de Memória
Instruções e
Processamento operandos
dados
resultados
4/72
A Máquina Original de Von Neuman
endereços
Unidade de
Controle
instruções
Memória
Unidade endereços
lógica e
aritmética
entrada
AC dados
saída
5/72
Arquitetura de Computadores em Níveis
Linguagens de
alto nível
Tradução
Assembly
Tradução
S.O.
Interpretação parcial
ISA
Microprograma
ou execução direta
Microarquitetura
Hardware
Lógica digital
6/72
Memória de
computador
7/72
Dispositivos de Memória
8/72
Leitura da Memoria
Memória
Leitura
0h B5h
1h ADh
2h 15h Endereço 3h
3h 1Fh Processador
4h 56h
5h 87h Conteúdo 1Fh
6h 13h
7h 98h
9/72
Escrita na Memoria
Memória
Escrita
0h B5h
1h ADh
2h 15h Endereço 6h
3h 1Fh
Processador
4h 56h
5h 87h Conteúdo FFh
6h FFh
13h
7h 98h
10/72
Mapa de Memória de um Programa C em Execução
Heap
Dados Globais
e Static
Código
Executável
11/72
Sistema de tipos
12/72
Funções dos Sistemas de Tipos
●
Armazenamento de dados em memória
– Codificação
– Decodificação
●
Execução de expressões
– Precedência
– Ordem de avaliação
●
Conversão de valores
●
Validação de tipos
13/72
Sistema de Tipos ANSI C
●
Tipos primários ●
Tipos definidos pelo
– char, short, int, usuário
long, long long, – enum,typedef
(signed / unsigned)
– float, double, long
double
●
Tipos derivados
– Tipo [], Tipo [][],
Tipo *, Tipo**,
struct {}, union
14/72
Tipos primários
do ANSI C
15/72
Tipos Primários do Ansi C – Família dos Inteiros
16/72
Tipos Primários do Ansi C – Ponto Flutuante
●
A codificação dos números reais se assemelha à
notação científica. Ex.: 678 → 6,78 x102
S E −bias
S EXPOENTE MANTISSA Valor=(−1) . M . 2
●
Exemplo padrão IEEE 754-1985 de 32 bits:
S EXPOENTE MANTISSA
0 01111100 01000000000000000000000
S E −bias
Valor=(−1) . M . 2
0 124−127
Valor=(−1) . 1,0100 . 2
−3
Valor=1,0100 . 2
Valor=(0,0010100)2
⁻3 −5
Valor=2 + 2 =1/8+1/32
Valor=0,125+0,0315=0,15625
18/72
Definição de
constantes
19/72
Constantes
20/72
Código ASCII
21/72
Código ASCII
22/72
Exercício U2.1 – Tipos primários no Linux 64
23/72
Tipos derivados
do ANSI C
24/72
Arrays
float[]
int[][]
10 20 15 18
44 65 2 5
16 25 6 36
23 15 56 36
25/72
struct
●
Cria tipos compostos
struct <identificadorDoTipo>
{
<tipo1> <identificadorMembro1>;
...
<tipon> <identificadorMembron>;
};
struct Point2D
{
float x;
float y;
int label;
};
26/72
struct
struct Point2D
{
float x;
float y;
int label;
} Var1;
P1.x = 10.0;
P1.y = 20.0;
P1.label = 20;
Var1 = P1;
27/72
union
●
Cria tipos que pode assumir valores e se comportar
como tipos diferentes
●
Não é feito teste de consistência, o programa deve
saber o tipo em uso
union u_tag{
int ival;
float fval;
char *sval;
} u;
printf("%d\n", u.ival);
printf("%f\n", u.fval);
printf("%s\n", u.sval);
28/72
Apontadores
float* pfloat;
float** ppFloat;
29/72
Tipos definidos
no programa
30/72
typedef
●
Cria novos tipos
●
Sinônimo para um tipo primitivo ou derivado
31/72
enum
●
Cria um tipos que enumera constantes simbólicas do
tipo inteiro
●
Não é feito teste de consistência entre o valor inteiro
armazenado e as constantes listadas
enum booleano { NO, YES };/* NO = 0, YES = 1 */
2. Analise o código
33/72
Declaração de
Variáveis
34/72
Declaração de Variáveis
<tipo> <identificadorDaVariavel>;
int fahr;
char c;
unsigned int indice;
long double saldoContaEikeBatista;
short cont;
float salarioDeProfessor;
float vector[3];
35/72
Declaração e Inicialização de Variáveis
36/72
Alocação automática e
dinâmica de memória
37/72
Alocação automática de memória
int
int
int number = 5; number 5
38/72
Alocação automática de memória
float vect[5];
float float float float float
vector
vector2 120 23 25 17
40/72
Alocação automática de memória
int main()
{
p
short V[2];
0x03CE10D3
V
short* pVet; e
pVet = V;
*pVet=5; t
pVet[0]=9;
PVet[1]=10;
*(pVet+1)=11;
}
0x0000000003CE10D3
0x0009
0x0005 V[0]
0x000B
0x000A V[1]
43/72
Alocação Dinâmica de memória
int main()
{
short* pVet;
pVet = malloc(5*sizeof(*pVet));
}
0xA5 0xA5
0x03CE10D4 0xFD
[0] 0xFD p
0x01 0x01
0xFF 0xFF V
0x96
[1] 0x03CE10D4
0x96 e
0xB7
0xE4
[2] 0xB7
0x32 t
0xDF 0x08
0x32 [3] 0xA5
0x08
0xFB
[4] 0xFD
0x01
0xA2 0xFF 44/72
Tratamento de
caracteres em C
45/72
Funções da Biblioteca ctype.h
●
Avaliação de caracteres:
– isalnum() se é alfanumérico
– isalpha() se é alfabético
– isblank() se é branco
– iscntrl() se is um caracter de controle
– isdigit() se é um digito decimal
– isgraph() se possui representação gráfica
– islower() se é letra minúscula
– isprint() se é imprimível
– ispunct() se caracter é símbolo de pontuação
46/72
Funções da Biblioteca ctype.h
●
Avaliação de caracteres:
– isspace() se é maiúsculo espaço em branco
– isupper() se é maiúsculo
– isxdigit() se é um dígito hexadecimal válido
●
Conversão de caracteres:
– tolower() para minúsculo
– toupper() para maiúsculo
47/72
String em C
48/72
String
char Str[5]="Uerj";
char Str[ ]="Uerj";
0xA5
0xFD
0x01
0xFF
0x96
0xB7
0x32
0x08
0x00000000001C10B3 0x55 Str[0]
0x65 Str[1]
0x72 Str[2]
0x6A Str[3]
0x00 Str[4]
49/72
Funções da Biblioteca string.h
●
Cópia:
– strcpy() copia string
– strncpy() copia caracteres de uma string
●
Concatenation:
– strcat() concatena strings
– strncat() concatena parte de uma string a outra
●
Comparison:
– strcmp() compara duas strings caracter a caracter
– strcoll() compara duas strings usando LC_COLLATE
– strncmp() compara até n caracteres de duas strings
– strxfrm() transforma string usando LC_COLLATE
50/72
Funções da Biblioteca string.h
●
Busca:
– strchr() a primeira ocorrência de um caracter
– strcspn() fornece o comprimento da substring inicial de
str1 contendo somente caracteres que não pertençam a str2
– strpbrk() idem strcspn(), retornando ponteiro
– strrchr() a última ocorrência de um caracter
– strspn() fornece o comprimento da substring inicial de
str1 contendo exclusivamente caracteres em str2
– strstr () localiza substring
– strtok () quebra string em tokens
●
Outras:
– strerror() obtém apontador para mensagem de erro
– strlen() obtém o comprimento da string
51/72
Exercício U3.3 – Funções de Manipulação de
Strings
52/72
Recursos
complementares
53/72
Register
●
Indica ao compilador que uma determinada variável
será usada exaustivamente.
●
Variáveis register não são armazenadas na memória
principal, mas nos registradores localizados dentro
do processador.
●
Melhora o desempenho dos programas
register int x;
register char c;
54/72
const
●
Especifica que o valor de uma variável ou parâmetro
de uma função não poderá ser modificado.
● Num array const os valores dos elementos
permanecem inalterados.
55/72
Operadores
56/72
Operadores Aritméticos
●
Operadores binários ●
Precedência e ordem de
+ soma avaliação
- (unário)
- subtração
* / %
* multiplicação
+ -
/ divisão
% resto da divisão ●
Exemplo
●
Operador unário 2*25.2/32*-3
- negativo = -4.725
57/72
Operadores Relacionais e Lógicos
●
Operadores binários ●
Operador unário
> maior que ! negação
>= maior ou igual ●
Precedência e ordem
< menor que * / %
<= menor ou igual + -
== igual a > >= < <=
!= diferente == !=
&& E lógico &&
|| OU lógico ||
= += *= ^⁼
58/72
Operadores Lógicos bit-a-bit
●
Aplicáveis a operandos ●
Operadores binários
da família de inteiros: & E-Lógico
char | OU-Lógico
short ^ Ou-Exclusivo
int ●
Operadores unários
long << left shift
long long >> right shift
~ complemento
59/72
Operadores Lógicos bit-a-bit
●
Exemplos
int n, x, y, z;
z = ~ 0xFF; /* z = 0xFF00 */
60/72
Operadores de Atribuição
●
Atribuição
n = 0xFF ;
●
Incremento e decremento
n++; ++n; n--; --n;
●
Atribuição + operador binário
n+=2; /* n=n+2
-= *= /= %= <<= >>= &= ^= |= */
61/72
Operadores: Precedência e Ordem de Avaliação
63/72
Conversões Automáticas
●
Expressões aritméticas fazem conversões
automáticas de tipos
– var1 <operador> var2
– se var1 e var2 são do tipo1 o resultado é
tipo1
– se var1 e var2 é são de tipos diferentes, durante o
cálculo um dos operandos é convertido
●
o resultado terá o mesmo para o qual o operando foi
convertido
64/72
Operandos de Tipos Distintos
●
Hierarquia de Conversão
double
float
unsigned long
long
unsigned int
int
65/72
Conversão Automática na Atribuição
●
Do tipo menor para o tipo maior → OK
double
float
unsigned long
long
unsigned int
int
●
Do tipo maior para o tipo menor → Truncamento
66/72
Conversão Automática do tipo char
67/72
Conversão Explícita de Tipo
(<tipo>) <expressão>
●
O tipo da expressão se mantém
● O resultado é convertido para <tipo>
68/72
Compilação e
Tabelas de Símbolos
69/72
Tabela de Símbolos
●
Estrutura de dados, normalmente uma hash, que armazena
informações sobre os identificadores
●
Na compilação:
– Monitoramento dos identificadores em uso
– Análise léxica, sintática e semântica
●
Arquivo objeto:
– Mapeamento das variáveis em endereços relativos de memória
●
Linking:
– definição dos endereços de memória absoluta
●
Debuging de Executáveis
●
Conjunto de entradas em bibliotecas compartilhadas
70/72
Tabela de Símbolos
72/72
Fim
73/72