Você está na página 1de 103

PROGRAMAÇÃO PARA

ENGENHARIA

Ano lectivo 2023-24


Aula#02:
- As expressões em C

João José da Costa


joao.costa@isptec.co.ao

Coordenação de Engenharia Informática


Departamento de Engenharias e Tecnologias
Instituto Superior Politécnico de Tecnologias e Ciências
As expressões em C

“Eu oiço e eu esqueço. Eu vejo e eu lembro. Eu faço e eu entendo.”


Anónimo

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 2


Sumário
1. A forma de um programa em C.
2. A biblioteca e a linkedição.
3. Compilação de um programa em C.
4. O mapa de memória em C.
5. Sentença geral na linguagem C.
6. Tipos de dados.
7. Modificadores de tipos primitivos.
8. Tipos de Dados Definidos no Padrão ANSI.
9. Identificador.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 3


Sumário
1. Variáveis.
2. Modificadores de tipo de acesso.
3. Constantes.
4. Especificadores de tipos de classe de
armazenamento.
5. Operadores.
6. Casts.
7. Comentários.
8. Funções de Biblioteca.
9. Formatos de Leitura e Escrita

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 4


Objectivos
● Instrutivo
◦ Fornecer conhecimentos e técnicas quanto a definição e
manipulação de variáveis e constantes, bem como a capacidade de
examinar os tipos de dados internos, variáveis, operadores e
expressões.
● Educativo
◦ Sentir a necessidade de entender e manipular variáveis e
constantes para aplicação em problemas sociais.

● Valores
◦ Humildade, Persistência e Perseverança.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 5


1. A forma de um programa em C
● As palavras reservadas listadas na tabela a seguir que,
combinada com a sintaxe formal do C, formam a linguagem
de programação C.

● Destas, 27 foram definidas pela versão original de C.

● As 5 restantes foram adicionadas pelo comitê ANSI: enum,


const, signed, void e volatile.

● Além disso, muitos compiladores C acrescentaram diversas


palavras-chave para explorar melhor a organização da memória
da família de processadores 8088 / 8086, que suporta
programação interlinguagem e interrupções.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 6


1. A forma de um programa em C (Cont.)

Palavras reservadas:

auto double int struct


break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 7


1. A forma de um programa em C (Cont.)

● Todas as palavras-chave em C são minúsculas.

● Uma palavra-chave não pode ser utilizada para nenhum


outro propósito em um programa em C.

● Todo programa em C consiste em uma ou mais funções.


Porquê ???

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 8


1. A forma de um programa em C (Cont.)

● A única função que necessariamente precisa estar


presente é a Função Principal (main), que é a primeira
função chamada quando é executado o programa em C.

● A Função Principal não é tecnicamente parte da


linguagem C.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 9


A forma geral de um programa em C
//inclusão de bibliotecas uma por linha
//declarações globais (inclui protótipos de funções)
tipo main(lista de parâmetros)
Se não definir um tipo para o main, o
{//início do bloco de instruções
que acontece ???
//sequência de comandos
} //fim do bloco de instruções
tipo funcao1(lista de parâmetros)
{//início do bloco de instruções
A rotina deve ficar sempre abaixo
//sequência de comandos do main ????
} //fim do bloco de instruções
Como é definida a lista de
… … … … … … parâmetros????
tipo funcaoN(lista de parâmetros)
E quanto aos retornos ???
{//início do bloco de instruções
//sequência de comandos
} //fim do bloco de instruções

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 10


1. A forma de um programa em C (Cont.)

● Protótipo da Função Principal


◦ Para o ambiente DOS (Linhas de comandos)
● main();
● int main(void);
● int main(int argc, char **argv);
● int main(int argc, char *argv[]);
◦ Para o ambiente Windows (Interface gráfica)
● int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE
hPrevInstance, LPTSTR pCmdLine, int nCmdShow);

● int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE


hPrevInstance, LPTSTR lpCmdLine, int nCmdShow);

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 11


1. A forma de um programa em C (Cont.)

● Exemplo para o ambiente DOS (Linhas de comandos)


#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])


{
printf("Ola!!! Bem-vindos ao C\n”);
system("pause");
return 0;
}

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 12


1. A forma de um programa em C (Cont.)

● Exemplo para o ambiente Windows (Interface gráfica)

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE


hPrevInstance, LPTSTR pCmdLine, int nCmdShow)
{
MessageBox(
NULL,
"Ola!!! Bem-vindos ao C” ,
"Saudacoes” , MB_OK);
return 0;
}

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 13


2. A biblioteca e a linkedição
● Biblioteca é o ficheiro contendo as funções padrão que
um programa em C pode utilizar. Essas funções incluem
todas as operações de entrada/saída (E/S) como também
outras rotinas úteis.

● Linkeditor é um programa que une funções compiladas


separadamente em um programa. Ele combina as
funções da biblioteca C padrões com o código que o
programador escreve.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 14


2. A biblioteca e a linkedição (Cont.)

● Quando chamamos uma função que não faz parte do


programa, o compilador C “Memoriza” seu nome,
depois o linkeditor (Linker) combina o código que o
programador escreveu com o código-objecto já
encontrado na biblioteca padrão. Este processo é
chamado de linkedição.

● A saída do linkeditor é um programa executável.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 15


3. Compilação de um programa em C

● O método exacto para compilar um programa depende


do compilador que está em uso.

● Alguns compiladores fornecem ambientes de


programação integrados que incluem um editor.

● Outros é necessário utilizar um editor separado para


criar programa.

● A linkedição varia muito entre os compiladores e os


ambientes.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 16


4. Compilação separada
● O C permite que um programa seja contido em vários
ficheiros e que cada ficheiro seja compilado
separadamente.

● Uma vez que todos os ficheiro sejam compilados, eles


são linkeditados com qualquer rotina de biblioteca para
formar um código-objecto completo.

● Vantagens
◦ Se houver uma mudança no código de um ficheiro, não será
necessário a recompilação do programa todo.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 17


Ciclo de desenvolvimento

(1) Filosofia, (2) Abstracção e (3) Geração automática


joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 18
5. O mapa de memória em C
● Um programa C compilado cria e utiliza quatro
regiões, logicamente distintas na memória, que
possuem funções específicas.

● A primeira região é a memória que contém o código do


programa.

● A segunda armazena as variáveis globais do programa.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 19


5. O mapa de memória em C (Cont.)

● A pilha é a terceira região que armazena o endereço de


retorno das chamadas de função, argumentos para
funções e variáveis locais.

● O heap é uma região de memória livre que o programa


pode utilizar, via funções de alocação dinâmica de C, em
aplicações como listas ligadas, árvores, etc.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 20


5. O mapa de memória em C (Cont.)

● A disposição exacta do programa pode variar de


compilador para compilador e de ambiente para
ambiente.
● Embora a disposição física exacta de cada uma das
quatros regiões possa diferir entre tipos de CPU e
implementações de C, a figura abaixo mostra
conceptualmente como o programa aparece na
memória.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 21


6. Sentença geral na linguagem C

● É uma linguagem Case Sensitive, isto é, faz distinção


entre maiúsculas e minúsculas.

● Cada instrução deve ser seguida por ponto e vírgula (;).

● A disposição de código é arbitrário e depende das


preferências de cada programador.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 22


6. Sentença geral na linguagem C (Cont.)

● Em C a função em que são colocadas todas as instruções


que queremos que sejam executadas chama-se main e
todo o código a executar é colocado entre { } .

● O conjunto de código existente entre chavetas chama-


se bloco. Ou seja, um bloco inicia com um "{" e
termina com um "}".

● Em C qualquer função tem que ser seguida por


parêntesis.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 23


6. Sentença geral na linguagem C (Cont.)

● Directivas de compilação (Também conhecido por


directrizes de pre-processador) são
informações/instruções que são passadas para o
compilador com o simbolo #.

● Especificador é uma palavra reservada da linguagem que


é utilizada para atribuir determinadas propriedades ao
tipos.

● O void para ponteiro é um ponteiro para qualquer coisa,


e para funções significa ausência de parâmetros ou
ausência de retorno.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 24


7. Tipos de dados
● Um tipo é uma abstracção de algo. Define o domínio de
valores e o tamanho em byte (conjunto de 8 bits) que
determinada variável ocupará em memória.

● Existem os seguintes grupos de tipos de dados: os tipos


primitivos, os tipos definidos pelo programador e os
definidos em bibliotecas externas.

● O tipo de dado associado a uma variável é o conjunto de


elementos que podem ser armazenados na variável.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 25


7. Tipos de dados
● Os tipos de dados primitivos pertencem a linguagem C,
todos os outros são baseados nesses.
● Os tipos de dados primitivos são:
◦ char – caractere.
◦ int – inteiro.
◦ float – real.
◦ double – real (o dobro float).
◦ void – nada.
● Para o programador definir um novo tipo precisa utilizar
o operador typedef.
● A definição de novo tipo é feita a partir da declaração.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 26


7. Tipos de dados
● A declaração de um novo tipo tem três componentes:
◦ A palavra reservada typedef.
◦ O tipo de dado.
◦ O nome para o novo tipo.

Exemplos:
/* cria o novo tipo de nome inteiro equivalente a int */
typedef int inteiro;

/* cria o novo tipo de nome String para permitir a uma variável associar uma cadeia de
caracteres */
typedef char* String;

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 27


8. Modificadores de tipos primitivos

● Os tipos primitivos podem ter vários modificadores


precedendo-os, excepto o tipo void.

● Um modificador é utilizado para alterar o significado do


tipo primitivo e adapta-lo a diversas situações.

● Os modificadores são:
◦ signed
◦ unsigned
◦ long
◦ short

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 28


9. Tipos de Dados Definidos no Padrão ANSI

Denominação Nº de Conjunto de Valores (Faixa mínima)


Bytes
char 1 Caracteres cód. ASCII
unsigned char 1 0 a 255
signed char 1 -127 a 127
int 2 Nº int. -32768 a 32767
unsigned int 2 0 a 65.535
signed int 2 O mesmo que int
short int 2 O mesmo que int
unsigned short int 2 0 a 65.535

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 29


9. Tipos de Dados Definidos no Padrão ANSI

Denominação Nº de Conjunto de Valores (Faixa mínima)


Bytes
signed short int 2 O mesmo que short int
long ou long int 4 Nº int. -65536 a 65535
unsigned long int 4 0 a 4.294.967.295
signed long int 4 O mesmo que long int
float 4 Nº reias -3,4x1038 a -3,4x10-38 e 3,4x10-38 a
3,4x1038
double 8 Nº reias -1,7x10308 a -3,4x10-308 e 1,7x10-308
a 3,4x10308
long double 8 Dez dígitos de precisão
void 0 Conjunto vazio

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 30


10. Identificador
● É uma sequência de letras, dígitos e caracteres escolhida pelo
programador e será utilizado pelo programa para se fazer
referência a variável ou função;

● Deve-se escolher um identificador (nome) para a variável que


tenha uma relação com a sua finalidade.

● Regra: O primeiro caractere deve ser uma letra, cifrão ou


um sublinhado e os caracteres subsequentes devem ser
letras, números, cifrão, ou sublinhados.
◦ Ex: salario, nome, _serial2

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 31


11. Variáveis
● Em programação, variável é uma posição de memória
cujo conteúdo pode ser modificado durante a execução
de um programa;

● Deve ser associado a cada variável: um identificador e


um tipo de dado.

● Toda variável em C deve ser declarada antes de ser


utilizada.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 32


11. Variáveis
● Genericamente existem dois tipos de variáveis:
◦ Variável de conteúdo ( chamada apenas de variável )
◦ Variável de endereço ( chamada de apontador ou ponteiro)

● A variável armazena o dado propriamente dito.

● O apontador armazena o endereço da variável ou de um


outro apontador.

● A variável e o apontador devem ser declarados : dentro


de funções (Local), na definição de parâmetro das funções
e fora de todas as funções (Global).

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 33


11. Variáveis
● Declaração de variável
◦ tipo lista_de_variável;
◦ Tipo : deve ser um tipo de dados válido em C mais quaisquer
modificadores.
◦ Lista_de_variável : Pode consistir em um ou mais nomes de
identificadores separados por vírgula.
● Ex:
/*declaração da variável idade do tipo int*/
int idade;
/*declaração da variável peso e altura ambas
do tipo float*/
float peso, altura;

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 34


11. Variáveis
● Declaração de apontador
◦ tipo lista_de_apontadores;
◦ Tipo : deve ser um tipo de dados válido em C mais quaisquer
modificadores.
◦ Lista_de_apontador : Pode consistir em um ou mais nomes de
identificadores (cada um precedido pelo asterisco) e separados por
vírgula.
● Ex:
/*declaração do apontador p1 e p2 ambos de
tipo float*/
float *p1, *p2;
/*declaração do apontador p do tipo int
inicializado com o valor NULL*/
int *p = NULL;

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 35


11. Variáveis
● Exemplo de declaração e uso:

int x; // declarado a variável x.


x = 3; // atribui-se em x o valor 3.
//declara-se abaixo o apontador ptr inicializado com o //valor NULL.
int *ptr = NULL;
//A seguir coloca-se no ponteiro ptr o endereço da variável //x para
o qual ele vai apontar.
ptr = &x;
//A seguir busca-se o conteudo armazenado no endereço que //se
encontra no ponteiro ptr e substitui-se pelo valor 7.
*ptr = 7;
//Deste modo o actual valor de x é 7 e o valor de ptr é o //endereço
de x.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 36


11. Variáveis
● Exemplo de declaração e uso (ilustrado):
1ª instrução 4ª instrução
int x; P = &x;
x p
23399
12ff01 12ff01
2ª instrução a3ff01
X = 3;
x 5ª instrução
3 *p = 7;
12ff01 x
3ª instrução 7
int *p = NULL; 12ff01
P
NULL
a3ff01

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 37


12. Modificadores de tipo de acesso

● Os modificadores de tipo de acesso também chamados


qualificadores, controlam como as variáveis podem
ser acessadas ou modificadas.

● Os modificadores de tipo de acesso são :


◦ const – impede a modificação de valores.
◦ Volatile – permite a mudança implícita de valores.

● Podem preceder os modificadores de tipos e os nomes


que eles modificam.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 38


12. Modificadores de tipo de acesso

● Variável do tipo const não pode ser modificada pelo seu


programa. Podem, entretanto, receber um valor inicial.
const int b = 4; // Declaração de constante em C
int dobro(const unsigned int numero){
return numero * 2;
}

● O modificador volatile é utilizado para informar o


compilador que o valor de uma variável pode ser alterada de
maneira não explicitamente especificada pelo programa.
◦ const volatile unsigned char *porta = 0x30;

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 39


13. Constantes
● A constante, tal como variável, é uma posição de memória à
qual devem ser associada um identificador e um tipo de dado.

● A diferença é o facto de que o conteúdo de uma constante que


é atribuída no momento de declaração não pode ser
modificado durante a execução do programa.

● Constantes em C podem ser de qualquer um dos cinco tipos


de dados básicos*.

● A maneira como da constante é representada depende de seu


tipo.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 40


13. Constantes
● Para tipo flutuante, se você colocar um F após o
número, será tratado como float. Se colocar um L,
tornará um long double.

● Para tipos inteiros, o sufixo U representa unsigned e o L


representa o long.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 41


13. Constantes
● Às vezes é mais fácil utilizar um sistema na base 8 ou 16
em lugar de 10.

● O sistema numérico na base 8 é chamado octal e utiliza


os dígitos de 0 a 7.

● O sistema na base 16 é chamado hexadecimal e utiliza


os dígitos de 0 a 9 mais as letras de A a F, que
representam 10, 11, 12, 13, 14 e 15, respectivamente.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 42


13. Constantes
● Em virtude desses números serem utilizados
frequentemente, C permite especificar constantes inteira
em hexadecimal ou octal em lugar de decimal.

● Uma constante hexadecimal de consistir de 0x seguido


por uma constante na forma hexadecimal.

● Uma constante octal começa com 0.

● Ex: const int hex = 0x2a2b;


const int oct = 027;

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 43


13. Constantes
● Sintaxe
● /* ocupa espaço na RAM */
const tipo_de_dado identificador = valor;
#define identificador valor //não ocupa espaço na
RAM

● Exemplo

• const float pi=3,142857;


• #define MAX 20

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 44


13. Constantes
● Colocar entre aspas simples todas as constantes tipo
caractere funciona para a maioria dos caracteres
imprimíveis.

● Outros são impossíveis de inserir pelo teclado. Por essa


razão, C criou as constantes especiais de caractere de
barra invertida.

● De modo a aumentar a portabilidade aconselha-se o uso


dos códigos de barra invertida em lugar de seus ASCII.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 45


13. Constantes

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 46


Exercícios

“Eu oiço e eu esqueço. Eu vejo e eu lembro. Eu faço e eu entendo.”


Anónimo

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 47


Exercícios
1. Qual é a função que deve estar presente em todos os
programas em C ?
2. Como devem terminar todas as instruções em C ?
3. Como é delimitado um bloco em C ?
4. A função printf faz parte integrante da linguagem C ?
5. Para que serve a linha #include <stdio.h> num programa ?
6. A linguagem C é Case Sensitive. O que isto quer dizer ?

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 48


Exercícios

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 49


Exercícios
Assinale com V, as declarações de variáveis (de dado e de
endereço) válidas e com F as inválidas.

a) [ ] v int ; b) [ ] char oo=070; c) [ ] double $b_; d) [ ] int _=3>2;

e) [ ] float x=y=4; f) [ ] char *er=”Erro”; g) [ ] int media*arit; h) void *xe;

i) [ ] void nada; j) [ ] int g=0c2f43; k) [ ] double $; l) [ ] int void;

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 50


Continuando…

“Eu oiço e eu esqueço. Eu vejo e eu lembro. Eu faço e eu entendo.”


Anónimo

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 51


14. Especificadores de tipos de classe
de armazenamento
● São utilizados para informar ao compilador como a
variável deve ser armazenada.
● Há quatro especificadores de classe de armazenamento
suportados por C, que são:
◦ extern
◦ static
◦ register
◦ Auto
● O especificador de armazenamento precede o resto da
declaração da variável. Sua forma geral é:
especificador_de_armazenamento tipo identificador;

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 52


14. Especificadores de tipos de classe
de armazenamento
● Exemplos
/*Variável que conserva o valor da última
chamada de forma incremental.*/
static int dado_estatico = 0;
/*O valor armazenado na variável é colocado no
registrador do processador, o que torna a execução
mais rápida.*/
register int dado_no_registador;
/*declaraçao de uma variável externa.*/
extern float f;
/*declaraçao de uma variável XXXXX.*/
auto float f;

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 53


14. Especificadores de tipos de classe
de armazenamento
● Especificador extern:
◦ Declara-se uma variável global apenas uma vez.

◦ Surgem transtornos quando tenta-se linkeditar os


módulos que contem variáveis globais com o mesmo
nome.

◦ O extern utiliza-se para indicar que uma determinada


variável global é externa ao módulo.

◦ Uma boa prática seria declarar todas as suas variáveis


globais em um ficheiro e utilizar declarações extern
nos outros.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 54


14. Especificadores de tipos de classe
de armazenamento

FICHEIRO 1 FICHEIRO 2

int x,y; extern int x,y;


main(){ int isMult2(){
extern int x;//Att return (x%2)&&(y%2);
} }

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 55


14. Especificadores de tipos de classe
de armazenamento
● Especificador static:

◦ Dentro de sua própria função ou ficheiro, variáveis


static são variáveis permanentes.

◦ São reconhecidas apenas dentro de sua função ou


ficheiro, mas mantêm seus valores entre chamadas.

◦ O especificador static tem efeitos diferentes em


variáveis locais e em variáveis global.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 56


14. Especificadores de tipos de classe
de armazenamento
● Especificador static:

◦ Em variáveis locais o compilador cria armazenamento


permanente, quase da mesma forma para variável
global.

◦ Uma variável local static retém seu valor entre


chamadas de função.

◦ Uma variável global static é reconhecida apenas no


arquivo no qual a mesma foi declarada.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 57


14. Especificadores de tipos de classe
de armazenamento
● Exemplos

1)static int estado = 2;

2)void conta_ate_n(const int n)


{
static int contador = 0;
if(contador / (n + 1)) return;
printf(" %d", contador++);
conta_ate_n(n);
}

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 58


14. Especificadores de tipos de classe
de armazenamento
● Especificador register:
◦ No padrão C ANSI pode ser aplicado a qualquer tipo
de variável.

◦ O padrão C ANSI simplesmente determina que "o


acesso ao objecto é o mais rápido possível".

◦ Dependendo da implementação do compilador C e de


seu ambiente operacional, variáveis register podem
ser manipuladas de quaisquer forma consideradas
cabíveis pelo implementador do compilador.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 59


14. Especificadores de tipos de classe
de armazenamento
● Especificador register:

◦ Uma variável register pode ser armazenada em um


registrador da CPU, variáveis register não podem ter
endereços.

◦ Não pode-se encontrar o endereço de uma veriável


register usando o operador &.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 60


14. Especificadores de tipos de classe
de armazenamento
● Especificador register:

◦ Embora o padrão C ANSI tenha expandido a


descrição de register, na prática ele geralmente só
tem um efeito significativo com os tipos inteiro e
caractere.

◦ Não devemos contar com aumentos substanciais da


velocidade para os outros tipos de variáveis.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 61


14. Especificadores de tipos de classe
de armazenamento
● Especificador register:

◦ Exemplo
1)register int i = 0;
for(; i < 20; printf(“Valor: %d\n”,i++));

2) int potencia (const unsigned int base, register


unsigned int espoente)
{
register int resultado;
resultado = 1;
for(; espoente; espoente--) resultado *= base;
return resultado;
}

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 62


14. Especificadores de tipos de classe
de armazenamento
● Especificador auto:
◦ A classe de armazenamento auto permite definir
variáveis locais.

◦ Trata-se do modo padrão de definição de variáveis,


por esse motivo ela raramente é utilizada.

◦ A classe auto só pode ser utilizada dentro de funções


e blocos de comandos definidos por um conjunto de
chaves {} (escopo local)

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 63


14. Especificadores de tipos de classe
de armazenamento
● Especificador auto:
◦ Exemplo

int potencia (const unsigned int b,


register unsigned int e)
{
auto unsigned int res;
res = 1;
for(; e; e--) res *= b;
return res;
}

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 64


15. Operadores

● C é muito rica em operadores internos.

● C dá mais ênfase aos operadores que a maioria das outras


linguagens de computador.

● C define quatro classes de operadores:


◦ Aritméticos.
◦ Relacionais
◦ Lógicos
◦ Bit a bit

● Além das classes acima , C tem alguns operadores especiais


para tarefas particulares.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 65


15. Operadores
Operador de Atribuição

◦ Em C, pode-se utilizar o operador de atribuição


dentro de qualquer expressão válida de C.

◦ A forma geral do operador de atribuição é:


● nome_da_variavel = expressão;

◦ O destino, ou a parte esquerda, da atribuição deve ser


uma variável ou um ponteiro, não uma função ou uma
constante.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 66


15. Operadores
Operador de Atribuição (cont.)

◦ C permite atribuir o mesmo valor a muitas variáveis


utilizando atribuição múltiplas em um único comando.

◦ Ex:
int x, y = 2.5;
x = x * y + 1;
int z = x = y = 1;

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 67


15. Operadores
Operadores aritméticos
Operador Operação
+ Adição
- Subtração
* Multiplicação
/ Divisão
% Resto de divisão
++ Incremento
-- Decremento

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 68


15. Operadores
Operadores Relacionais
● Os compiladores C realizam comparações entre valores
através de operadores relacionais:
◦ maior que (>)
◦ maior ou igual a (>=)
◦ menor que (<)
◦ menor ou igual a (<=)
◦ igual (==)
◦ diferente (!=)

● O resultado de uma avaliação de uma relação é 1 (um) se


for verdadeiro ou 0 (zero) se for falso.
joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 69
15. Operadores
Operadores lógicos

R1 R2 R1 && R2 R1 || R2 R1 !R1
0 0 0 0 1 0
0 1 0 1 0 1
1 0 0 1
1 1 1 1

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 70


15. Operadores
Operadores bit a bit

● Refere-se a testar, atribuir ou deslocar os bits efectivos em


um byte ou uma palavra, que correspondem aos tipos de
dados char e int e variantes do padrão C.

● Os operadores bit a bit não podem ser utilizados em float,


double, long double, void ou outros tipos mais
complexos.

● Essas operações são aplicadas aos bits individuais dos


operandos.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 71


15. Operadores
Operadores bit a bit

● Os operadores bit a bit são:

◦ & (AND)
◦ | (OR)
◦ ^ (OR exclusivo - XOR)
◦ ~ (Complemento de um)
◦ >> (Deslocamento à direita)
◦ << (Deslocamento à esquerda)

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 72


15. Operadores
Operadores bit a bit

● Exemplo 1:

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 73


15. Operadores
Operadores bit a bit

● As operações bit a bit mascaram certos bits, como o bit de


paridade.

● O bit de paridade confirma se o restante dos bits em


byte não se modificaram (É geralmente o bit mais
significativo em cada byte.).

● A paridade é indicada pelo oitavo bit, que é colocado 0,


fazendo-se um AND com um byte em que os bits de 1 a 7
são 1 e o bit 8 é 0.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 74


15. Operadores
Operadores bit a bit

● Exemplo 2:

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 75


15. Operadores
Operadores bit a bit

● O operador OR, ao contrário de AND, pode ser utilizado


para ligar um bit.
● Exemplo 3:

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 76


15. Operadores
Operadores bit a bit

● Um OR exclusivo, normalmente abreviado por XOR,


activa um bit se, e somente se, os bits comparados forem
diferentes. Por exemplo, 127^120 é :

● Exemplo 4:

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 77


15. Operadores
Operadores bit a bit

● Operações bit a bit podem possuir valores diferentes de 0


e 1, mas os operadores lógicos sempre conduzem a 0 ou
1.

● Os operadores de deslocamento, >> e <<, movem todos


os bits de uma variável para a directa ou para esquerda,
como especifico.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 78


15. Operadores
Operadores bit a bit

A forma geral do comando de deslocamento à direita é:


variavel >> numero de posicoes de bits

A forma geral do comando de deslocamento à esquerda é:


variavel << numero de posicoes de bits

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 79


15. Operadores
Operadores bit a bit

● Conforme os bits são deslocados para uma extremidade,


zeros são colocados na outra.

● Os bits deslocados são perdidos e zeros são colocados.

● Esta operação pode ser útil quando se decodifica a entrada


de um dispositivo externo, e quando se lê informação de
estado.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 80


15. Operadores
Operadores bit a bit

● Os operadores de deslocamento em nível de bits também


podem multiplica e dividir inteiros rapidamente.

● Um deslocamento a esquerda efectivamente multiplica um


número por 2 e um deslocamento à direita divide-o por 2.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 81


15. Operadores
Operadores bit a bit
● Exemplo 5:

● Obs: A divisão subsequente não trazem de volta bits


anteriormente perdidos.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 82


15. Operadores
Operadores bit a bit

● O operador de complemento a um, ~, inverte o estado de


cada bit da variável especificada.
● Pode ser utilizado para sifrar e decifrar uma palavra.

● Exemplo 4:

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 83


15. Operadores
Resumo de precedência

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 84


16. Casts

● Podemos forçar uma expressão a ser de um determinado


tipo utilizando um cast.

● A forma genérica de um cast é:


(tipo) expressão
◦ onde tipo é qualquer tipo de dados válido em C.

● Exemplo
Int x = (int)5/2;

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 85


16. Casts
● Exemplo

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 86


17. Comentários
● Em C, comentários podem ser escritos em qualquer lugar
do texto para facilitar a interpretação do algoritmo.

● Para identifica-lo ele deve ter um /* antes e um */ depois.

● Ex:.
/* Aqui escrevo o meu comentário*/

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 87


18. Funções de Biblioteca
Sintaxe Exemplo
printf(“Informação“); printf(“Bem-vindo” );

printf(“Informação formato“, variavel); printf("Resultado=%d " , a );

printf(“Informação formato Informação “, printf("Resultado=%d da soma" , a );


variável);

Protótipo
_CRTIMP int __cdecl printf (const char*, ...);

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 88


18. Funções de Biblioteca
Sintaxe Exemplo
printf(“formato“, endereço); scanf("%d " , &a );

printf(“formatos“, endereços); scanf("%d %f" , &a, &b);

Protótipo
_CRTIMP int __cdecl scanf (const char*, ...);

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 89


18. Funções de Biblioteca
Biblioteca Argumentos Tipos de Arg. Retorna
fabs(x) float Valor absoluto de x
cos(x) float Coseno de x
log(x) float Logaritmo natural de x
log10(x) float Logaritmo decimal de x
math.h pow(x,y) float, float x elevado a y
pow10(x) int 10 elevado a x
sin(x) int Seno de x
sqrt(x) float Raiz quadrada de x
tan(x) float Tangente de x
stdlib.h random(x) float Um número aleatório entre 0 e x-1
ctype.h tolower(x) char Converte o caractere x para minúsculo
ctype.h toupper(x) char Converte o caractere x para maiúsculo

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 90


19. Formatos de Leitura e Escrita
Tipo Formato Observações
char %c Um único carácter

int %d ou %i Um inteiro (Base decimal)

int %o Um inteiro (Base octal)

int %x ou %X Um inteiro (Base Hexadecimal)

short int %hd Um short inteiro (Base decimal)

long int %ld Um long inteiro (Base decimal)

unsigned short int %hu Short int positivo

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 91


19. Formatos de Leitura e Escrita
Tipo* Formato Observações
unsigned int %u Inteiro positivo

unsigned long int %lu Long inteiro positivo

float %f ou %e ou %E Um número real


double %f ou %e ou %E Um número real
char* %s Cadeia de caracteres

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 92


Exercícios

“Eu oiço e eu esqueço. Eu vejo e eu lembro. Eu faço e eu entendo.”


Anónimo

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 93


Exercícios

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 94


Exercícios

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 95


Exercícios

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 96


Exercícios

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 97


Exercícios

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 98


Exercício
Considere a declaração
double x = 18.0/quadrado(2+1);
Para cada uma das versões da função macro
quadrado abaixo, escreva o valor correspondente
de x.
1. #define quadrado(x) x*x
2.#define quadrado(x) (x*x)
3.#define quadrado(x) (x)*(x)
4.#define quadrado(x) ((x)*(x))

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 99


Exercícios

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 100


Exercícios

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 101


Perguntas

“Eu oiço e eu esqueço. Eu vejo e eu lembro. Eu faço e eu entendo.


Anónimo

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 102


Quer saber mais…
● Leia …
◦ Capítulo 1 (O Meu Primeiro Programa) - Damas,
Luís. Linguagem de programação C. 15ª Edição, Editora
FCA – Editora de Informática.. Janeiro 1999.
◦ Capítulo 2 (Tipos de Dados Básicos) - Damas, Luís.
Linguagem de programação C. 15ª Edição, Editora FCA –
Editora de Informática.. Janeiro 1999.
Se ainda tem algum tempo, leia …
◦ Capítulo 5 (Funções e Procedimentos) - Damas,
Luís. Linguagem de programação C. 15ª Edição, Editora
FCA – Editora de Informática.. Janeiro 1999.

joao.costa@isptec.co.ao (João José da Costa) @ ISPTEC 2021-22 103

Você também pode gostar