C/Variáveis: diferenças entre revisões

Origem: Wikilivros, livros abertos por um mundo aberto.
< C
[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Linha 40: Linha 40:
|}
|}


== Atribuir valores à variável ==
== Atribuição de valores à variáveis ==


Nós podemos atribuir um valor á variável através do operador de atribuição "=", vide exemplo:
Nós podemos atribuir um valor à uma variável através do operador de atribuição "=". Vide exemplo:
* [nome da variável] = [valor];
* [nome da variável] = [valor];
* a = 5;
* a = 5;


Este operador assemelha-se ao igual da matemática, mas não o é!! (para fazermos a igualdade recorremos ao operador de teste de igualdade que é = = (dois iguais).)
Apesar de este operador se assemelhar ao igual da matemática sua função é diferente, para fazermos a igualdade recorremos ao operador de teste de igualdade que é "==" (dois iguais).
Ele antes diz: coloca o valor que me segue e coloca-o na variável que me foi precedida.


Claro está que teremos de declarar a variável antes de atribuir o valor.
Ele antes diz: coloca o valor que me segue e coloca-o na variável que me foi precedida. Está claro que teremos que declarar a variável antes de atribuir o valor ou .


'''Pergunta''': será que isto é mesmo necessário, ie, declarar a variável antes de atribuir valor?
'''Pergunta''': será que isto é mesmo necessário, ie, declarar a variável antes de atribuir valor?

Revisão das 22h44min de 16 de janeiro de 2007

Esta página precisa ser reciclada (discuta).
Ao melhorá-la, você estará ajudando o Wikilivros.

Declarando variáveis

Para utilizarmos informações, é necessário que o computador as receba e as "memorize". Para que seja possivel para o computador "memorizar" algo, antes é preciso alocar (reservar) espaço na memória. Podemos fazer isso declarando uma variável.

Ao declararmos uma variável, não apenas estamos reservando um espaço de memória, como também estamos associando um nome a ele, o identificador ou identifier. Ao invéz de utilizarmos o endereço da variável na memória, que seria geralmente notado na forma hexadecimal, como por exemplo: 0x0012FED4, nos referimos ao endereço apenas pelo seu nome. Apenas para deixar claro, a própria notação em hexadecimal já é uma simplificação, pois computadores na verdade trabalham com binário.

A sintáxe da declaração de variáveis é [tipo de variável] [nome da variável]; // Note o ponto e virgula no final.

Exemplificando, poderíamos declarar:

  • int a; // Declaro uma variável com o nome “a” e do tipo int, logo poderá guardar qualquer valor entre 0 e 65365, reserva 2 bytes
  • char manel; //declaro uma variável chamada de manel que vai guardar uma letra, vai ser reservado 1 byte para esta variável

Podemos declarar várias variáveis ao mesmo tempo se elas forem da mesma tipologia.

  • int a, b, c ; // declaro 3 variáveis de tipologia int, para cada uma será reservado 2 bytes, logo ao todo são reservados 6bytes.

O nome da variável (identifier)

Existem algumas restrições quanto ao nome que podemos dar:

  • Só podemos utilizar as letras do alfabeto de A a Z (maiúsculas ou minúsculas) e underscore "_".
  • Depois da primeira letra do nome ainda se pode utilizar os dígitos.
  • O nome não pode ter espaços.
  • O nome não pode ser igual á de outra variável já existente.
  • O nome não pode ser igual á das palavras reservadas á sintaxe da linguagem C++.
  • Temos um tamanho máximo para o nome da variável que é 31 bits.

Palavras reservadas

As palavras reservadas não é mais do que a sintax da própria linguagem C++. Vendo noutra óptica uma vez que estamos aqui para ficar craques em c++ vamos aprender o significado de cada uma destas palavras e ainda o seu contexto. a linguagem c++ permite fazer com que uma palavra tenha vários significados dependendo do contexto, por isso é que conseguimos ter tão poucas palavras e conseguimos fazer tanto. Lista de Palavras Reservadas do C++

int,char float double short long,signed unsigned void bool wchar_t for if else goto return do while break switch case continue asm, catch,const_cast, reinterpret_cast dynamic_cast,typename,default, delete, enum explicit, export, extern, friend, inline, mutable, namespace, new, operator, register true, false const auto typedef sizeof, static, static_cast, struct, union, class, public, private, protected,template, this, throw, try, typeid, using, virtual, volatile, and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq

Atribuição de valores à variáveis

Nós podemos atribuir um valor à uma variável através do operador de atribuição "=". Vide exemplo:

  • [nome da variável] = [valor];
  • a = 5;

Apesar de este operador se assemelhar ao igual da matemática sua função é diferente, para fazermos a igualdade recorremos ao operador de teste de igualdade que é "==" (dois iguais).

Ele antes diz: coloca o valor que me segue e coloca-o na variável que me foi precedida. Está claro que teremos que declarar a variável antes de atribuir o valor ou .

Pergunta: será que isto é mesmo necessário, ie, declarar a variável antes de atribuir valor?

Iniciar

Declarar e atribuir valores a variáveis ao mesmo tempo = iniciação Quando se faz as duas operações ao mesmo tempo, chama-se a isso iniciação.

  • int testScore = 95;

Não se pode atribuir valor antes de fazer a declaração da variável, porque na hora da compilação o compilador não sabe a tipologia da variável.

  • testScore = 95;
  • int testScore; //erro de compilação

Pode-se iniciar várias variáveis ao mesmo tempo.

  • int a = 95, b=3 ;

Ou se quisermos

  • int a, b, c;
  • a = b = c = 0;

Neste ultimo caso, primeiro vai ser colocado o valor zero na variável c, depois a variável b vai copiar o valor presente na variável “c” e por fim a variável “a” vai copiar o valor da variável “b”

Depois ainda temos o pormenor: o valor existente numa variável pode ser mudado. Se tivermos

  • a=2
  • a=3.

no fim o valor presente na variável a será de 3.

Compatilbilidade de dados entre declaração e atribuição de valor

e se tentarmos colocar um valor diferente do que a tipologia da variável está á espera? aí temos um problema de compatibilidade de dados:

Caso1: declaramos um int e colocamos uma letra Aqui teremos um erro de compilação, em que nos diz que não conseguimos converter o char em int.

Caso2: declaramos um int e colocamos uma string Aqui teremos um erro de compilação, em que nos diz que não conseguimos converter “const char [5]’ to ‘int’. Ou seja o compilador ainda tem alguns sistemas de conversão isso dá o caso 3

Caso3: declaramos um int e colocamos um float Neste caso se colocarmos 77,33, irá ser apenas guardado o valor 77. Perde-se o .33

Caso 4: overflow : declaramos um short e colocamos um valor superior ao limite de reserva. recordam-se que o short vai de [–32768 a 32767], este é o caso onde vamos colocar um valor superior ao limite máximo. Neste caso iríamos colocar 32768. Não vai acontecer nenhum erro de compilação mas o que resulta é que vai ser impresso um número negativo - 32768. A lógica disto tem a ver com a parte aritmética. Pode ser feita uma analogia com as horas. Imaginemos que iremos somar 6 horas com 7 horas. O resultado seria 13, mas como não existe 13 no relógio, iria dar a volta nas horas e chegaria ao 1. Assim o resultado seria 1.

Caso 5: underfloat: declaramos um int e colocamos um valor inferior ao limite de reserva do int. Aqui o caso é exactamente a mesma lógica do caso de overflow, mas desta vez ultrapassa-se o limite inferior

Caso 6: declaramos um unsigned int e colocamos um número negativo O que acontece aqui é o overflow.

Adress Operator

Quando declaramos uma variável é reservado uma porção de memória para poder receber o valor que vamos guardar. Esse tamanho depende da tipologia da variável, como também já se disse. Agora podemos saber o endereço da memória reservada recorrendo ao operador address. Este operador vai dar o endereço do primeiro byte da memória reservada. Ele vai exprimir esse endereço na linguagem hexadecimal.

#include <iostream>
using namespace std;
int main(void)
{
  int a=2;
  cout << "o valor de a é : "  << a << "\n";
  cout << "o valor da variável está guardado no endereço "  << &a << "\n";
  cout << "esse valor vai ocupar  " << sizeof(a) << "bytes"<< "\n";
  cout << "o endereço da variável ocupa " << sizeof(&a) << "bytes"<< "\n";
  system ("pause");
  return 0;
}

Vai ser o sistema operativo que vai escolher a localização da variável, logo do endereço da memória

Pergunta: como saber o endereço de onde está guardado o endereço de uma variável?

Pergunta: onde é que está guardado o nome da variável

A função sizeof();

  • int a = sizeof (char);

A função sizeof(); pode ter como argumento uma tipologia de variável ou mesmo a própria variável. O retorno dessa função é o tamanho, em bytes, reservados à tipologia ou à variável. No exemplo acima associa o valor 1 a “a” porque é um char.

Este operador permite determinar a quantidade de memória que é reservada para cada tipologia de variável

#include <iostream>
using namespace std;
int main(void)
{
cout << "Size of short is " << sizeof(short) << "\n"; /* estamos a chamar o operador sizeof e inserimos como parâmetro a tipologia short */
system (“pause”);
return 0;
}