if
e de selecção if
else
gdb
no editor XEmacs//
Inclusão de ficheiros de interface de bibliotecas e módulos (a explicar mais tarde):#include <iostream>
//
Directiva de utilização do espaço nominativostd
(a explicar mais tarde):using namespace std;
int main()
{
...
//
Aqui é onde se escreve o programa.}
Nota: Todas as frases
precedidas de //
ou entre /*
e */
são
comentários, sendo ignorados pelo compilador.
tipo nome = valor;//
definição de uma variável.tipo nome(valor); //
idem.
tipo nome; //
definição de uma variável sem inicialização.
double y = 2.1; //
definição de uma variável do tipodouble
denominaday
e//
com valor inicial 2,1.
int x; //
definição de uma variável do tipoint
denominadax
e//
não inicializada (contém lixo).
x = 2; //
atribuição do valor 2 à variávelx
(não é uma inicialização).
Tipo | Descrição | Gama de valores (típica) | Número de Bits (típico) |
---|---|---|---|
bool |
valor booleano | true e false |
8 |
int |
número inteiro | -231 a 231-1
(-2147483648 a 2147483647) |
32 |
float |
número decimal
(com vírgula) |
1.17549435 × 10-38 a
3.40282347 × 1038 (e negativos) |
32 |
char |
caractere
(usa código ISO Latin1) |
Qualquer caractere. Exemplos: 'a ', 'A ', '1 ', '! ', '* ',
etc. |
8 |
short [int] |
número inteiro | -215 a 215-1 (-32768 a 32767) | 16 |
unsigned short [int] |
número inteiro positivo | 0 a 216-1 (0 a 65535) | 16 |
unsigned [int] |
número inteiro positivo | 0 a 232-1 (0 a 4294967295) | 32 |
long [int] |
número inteiro | a mesma que int |
32 |
unsigned long [int] |
número inteiro positivo | a mesma que unsigned int |
32 |
double |
número decimal
de precisão dupla |
2.2250738585072014 × 10-308
a
1.7976931348623157 × 10308 (e negativos) |
64 |
long double |
número decimal
de precisão tripla |
3.36210314311209350626e × 10-4932 a 1.18973149535723176502 × 104932 (e negativos) | 96 |
Notas:
char
) são interpretados como números
inteiros em C++. Assim, quer em Linux sobre processadores Intel quer
no Windows NT, a gama dos códigos vai de -128 a 127, isto é,
os char
são interpretados como números inteiros com
sinal.int
podem ser escritos de uma forma
abreviada: os []
indicam a parte opcional na especificação
do tipo.long double
tem 64 bits.O resultado da execução das linhas acima é:
char caractere = 'a';
++caractere; //
o mesmo quecaractere = caractere + 1
.cout << "O caractere seguinte é: " << caractere << endl;
cout << "O seu código é: " << int(caractere) << endl;
Adicionou-se uma unidade ao código do caractere
O caractere seguinte é: b
O seu código é: 98
'a'
(97)
de modo que a variável caractere
passou a conter o código
do caractere 'b'
(98).
Importante: Isto é
válido porque, no código usado em Linux (ASCII), as letras
do alfabeto possuem códigos sucessivos (quer em maiúsculas
quer em minúsculas).
(Experimente fazer o mesmo para o caractere 'z'
ou para o caractere
'Z'
e veja o resultado.)
'a' //
do tipochar
, representa o código do caractere 'a'.100 //
do tipoint
, valor 100 (em decimal).100.0 //
do tipodouble
(e nãofloat
).100.0F //
do tipofloat
.100.0L //
do tipolong double
.1.3e230 //
do tipodouble
, valor 1,3 × 10230.
const
imediatamente após o tipo, o valor da variável passa a ser
fixo, não podendo ser modificado. Nesse caso deixa de se ter
uma variável: passa a ser uma constante. Como é
óbvio, as constantes têm de ser inicializadas durante a definição.
O nome genérico para variáveis e constantes é instância.
int const x = 2;
char const cifrão = ´$´;
+
(soma)-
(subtracção)*
(multiplicação)/
(divisão inteira)%
(resto da divisão inteira [módulo])
>
(maior)<
(menor)>=
(maior ou igual)<=
(menor ou igual)==
(igual)!=
(diferente)
not
negação (ou!
)and
conjunção (ou&&
)or
disjunção (ou||
)
Importante: Repare-se bem na diferença entre=
(atribuição)+=
(x += y
é equivalente ax = x + y
)-=
(x -= y
é equivalente ax = x - y
)*=
(x *= y
é equivalente ax = x * y
)/=
(x /= y
é equivalente ax = x / y
)%=
(x %= y
é equivalente ax = x % y
)
=
(atribuição)
e ==
(comparação, igual).
Nota: Mais tarde se verá que as "equivalências" acima não são rigorosamente equivalentes...
Nota: Em rigor estas "equivalências" não são verdadeiras. Ver as folhas teóricas para mais pormenores.++
(x++
e++x
são equivalentes ax = x + 1
)--
(x--
e--x
são equivalentes ax = x - 1
)
Importante: Os operadores bit-a-bit devem ser utilizados apenas sobre valores de tipos aritméticos inteiros sem sinal.compl
negação (ou~
)bitand
conjunção (ou&
)bitor
disjunção (ou|
)xor
disjunção exclusiva (ou^
)<<
(deslocamento para a esquerda [atenção! não confundir com a inserção num canal!])>>
(deslocamento para a direita [atenção! não confundir com a extracção de um canal!])
cout
)int a = 10; cout << "Vou escrever um número a seguir a esta frase: " << a << endl;
cin
)Importante: Ao ser executada uma operação de leitura como acima, o computador interrompe a execução do programa até que seja introduzido algum valor no teclado.cin >> a;
if
e de selecção if
else
if(expressão_booleana)
instrução_controlada1
else
instrução_controlada
2
if(expressão_booleana) {
... //
instruções a executar se a expressão booleana for
verdadeira.
} else {
... //
instruções a executar se a expressão booleana for
falsa.
}
ou, usando instruções compostas (ou blocos de instruções),
if(expressão_booleana)
instrução_controlada
Se a expressão booleana for falsa continua o programa.
//
if(expressão_booleana) {
... //
instruções a executar
se a expressão booleana for verdadeira.
}
//
Se a expressão booleana for falsa continua o programa.As instruções
if(x > 0)
cout << "x é positivo." << endl;
else {
cout << "x é negativo ou zero (não-positivo)." << endl;
}
if
else
podem ser encadeadas.
Por exemplo,
Mas nesse caso é usual usar uma indentação diferente para o código C++ de modo a deixar mais clara a sequência de instruções alternativas,
if(x > 0) {
cout << "x é positivo." << endl;
} else
if(x < 0)
cout << " x é negativo " << endl;
Nota: Quando existe apenas uma instrução dentro de um dos blocos a executar podem ser omitidas as chavetas, como é o caso do
if(x > 0) {
cout << "x é positivo." << endl;
} else if(x < 0)
cout << " x é negativo " << endl;
else
e do segundo
if
.
Nota: O bloco else
pode não existir, caso não se pretenda executar nenhuma instrução
quando a expressão booleana for falsa, como é o caso do segundo
if
.
Importante: Por vezes pode
ser ambíguo a que if
diz respeito um dado else
.
A regra é que o else
pertence ao if
mais interior
(mais "próximo"). A indentação utilizada não
influencia a interpretação do compilador, embora possa induzir
o programador em erro. Por exemplo, o código
não faz o que é suposto, pois é equivalente a
if(x >= 0)
if(x > 0)
cout << "x é positivo." << endl;
else
cout << "x é negativo." << endl;
Para que o código faça o que se pretendia é necessário envolver o
if(x >= 0) {
if(x > 0)
cout << "x é positivo." << endl;
else
cout << "x é negativo." << endl;
}
if
mais interior em chavetas de modo a impossibilitar
a sua associação com o else
, i.e.,
Nota: Uma instrução
if(x >= 0) {
if(x > 0)
cout << "x é positivo." << endl;
} else
cout << "x é negativo." << endl;
if
sem else
é sempre equivalente a uma instrução
if
else
em que a instrução controlada pelo
else
é
a instrução nula (que só possui o terminador
;
).
Ou seja,
é equivalente a
if(x > 0)
cout << "x é positivo" << endl;
if(x > 0)
cout << "x é positivo" << endl;
else
;
while
while
serve
para repetir a instrução instrução_controlada
enquanto
se verificar a condição dada pela expressão_booleana
.while(expressão_booleana)
instrução_controlada
while(expressão_booleana)
{
instruções
}
Importante: Uma instrução pode ser composta (bloco de instruções), i.e., uma sequência de instruções envolvida por chavetas.
int n = 11;
int i = 0;
while(i != n) {
cout << i << ' ';
++i;
}
for
for
serve,
normalmente, para repetir um conjunto de instruções um número
determinado de vezes.ou
for(inicialização; expressão_booleana; progresso)
instrução_controlada
for(inicialização; expressão_booleana; progresso) {
instruções
}
Ciclo para mostrar no ecrã os inteiros de 0 a 9 (inclusive) construído de três formas diferentes.
while
:
int i = 0;
while(i != 10) {
cout << i << ' ';
++i;
}
cout << endl;
for
:
ou
for(int i = 0; i != 10; ++i)
cout << i << ' ';
cout << endl;
int i = 0;
for(; i != 10; ++i)
cout << i << ' ';
cout << endl;
gdb
no editor XEmacsDebug
do XEmacs (ou pressione <ctrl-c
d>
) e indique o nome do ficheiro executável (o nome do executável
é o nome do ficheiro sem a extensão
.C
).
Principais comandos do depurador:
(b)reak main
: pára a execução na primeira
linha do programa para podermos ver a sua execução linha
a linha (para "traçar" o programa). É possível
inserir pontos de paragem (breakpoints) noutros locais do programa
usando o comando b número_da_linha
ou o botão
Stop
.(r)un
: executa o programa desde o início até
ao fim ou até ao primeiro ponto de paragem encontrado.(n)ext
(ou botão Step Over
): executa a próxima
linha de programa (a que está assinalada).(s)tep
(ou botão Step Into
): entra dentro
da rotina que está prestes a ser executada.(c)ontinue
: continua a execução do programa
até ao fim ou até ao próximo ponto de paragem.(p)rint nome_de_uma_variável
(ou botão p=
):
mostra o valor actual de uma variável.(disp)lay nome_de_uma_variável
: mostra o valor
da variável indicada após cada comando dado ao depurador.(q)uit
: Termina a execução do depurador.