Este material cobre diversos aspectos relacionados com o conceito de variável, p.ex. declaração, atribuição, inicialização, tipo.
Em diversas linguagens de programação existe o conceito de variável. Uma variável corresponde a uma posição de memória. Uma posição de memória pode guardar um valor. Uma declaração de variável define seu tipo e o identificador (nome) e também outros atributos. Uma das coisas que podemos fazer com uma variável é usa-la como alvo de uma iniciação/inicialização ou ainda como alvo de uma operação de atribuição (assignment).
A sintaxe simplificada para a declaração de uma variável é:
A sintaxe simplificada de um comando ou operação de atribuição é:
O trecho de programa a seguir ilustra algumas declarações de variáveis e comandos de atribuição:
O tipo restringe os valores que podem ser atribuidos a uma variável. O tipo int permite a representação de valores de -2.15 bilhões até +2.15 bilhões, o tipo long permite a representação de valores de -9.22 quintilhões ate' +9.22 quintilhões. A restrição de tipo para uma variável acarreta maior disciplina por parte do programador e permite programas mais eficientes e com menor probabilidade de erros. O trecho a seguir não é permitido na linguagem Java:
A associação de um tipo a uma variável na Computação é similar à amarração de uma variável a um domínio como ocorre na Matemática. No entanto deve ser ressaltado que o conceito de variável em Computação e o conceito de variável em Matemática são conceitos que apresentam aspectos distintos. Uma das distinções mais notáveis é que uma variável na Matemática, usualmente, não tem um valor específico. Considere a expressão da Matemática
A linguagem Java tem oito tipos primitivos:
É interessante que não exista o mnemônico integer ao invés int, ou real ao invés de float, afinal os computadores representam apenas um subconjunto finito dos domínios infinitos correspondentes encontrados na Matemática. O tipo byte permite representar valores de -128 a +127. O tipo short permite representar valores de -32768 a 32767. O tipo byte é muito usado em programas voltados para recursos computacionais, pois as variáveis deste tipo correspondem à menor posição endereçável da maioria dos computadores.
Cada tipo tem literais que são as cadeias de caracteres que representam os valores constantes disponíveis. O tipo boolean tem somente dois literais: (1)
true e (2) false. Cada valor inteiro (ou mais apropriadamente cada valor do tipo int) pode ter vários literais, um literal decimal, um literal hexadecimal ou um literal octal (base oito!).O trecho de programa Java correspondente a
System.out.println(<argumento) ou System.out.print(<argumento) corresponde a invocar a impressão do argumento no video do sistema. O argumento deve ser do tipo String (o tipo String não é um tipo primitivo e será visto mais a frente na disciplina). A linguagem Java permite que o programador use como argumento uma variável ou expressão de um tipo que não seja String, e neste caso é feita uma conversão do argumento para o tipo String. Os programas abaixo ilustram declarações de variáveis e comandos de atribuição conforme discutido acima. Observe o uso de "comentários", eles podem ser introduzidos através do uso de duas barras: //class VariavelTipoInt{
public static void main(String args[]){
int i; // declaração
i=3; // comando de atribuição
System.out.println(i); /*Aqui ocorre uma conversão do valor 3
de tipo int para um valor do tipo String */
}
}
Literais
Um literal é a forma de representar no texto de um programa um valor de um certo tipo. A linguagem Java apresenta 6 tipos de literais:
IntegerLiteral
FloatingPointLiteral
BooleanLiteral
CharacterLiteral
StringLiteral
NullLiteral
Os literais String (cadeias de caracteres) consistem de sequências de caracteres delimitadas por aspas (p.ex. "A", "AB", "ABC", "ABCD"). Existem também expressões do tipo String. O operador + (adição) além de representar a soma de inteiros ou soma de ponto flutuante pode representar a concatenação de cadeias de caracteres. A cadeia "ABCD" é equivalente à expressão "AB" + "CD" ou à expressão "A" + "BCD".
Os literais inteiros podem ser expressos por seqüências de caracteres em decimal (p.ex. 1, 23, 456), seqüências de caracteres em hexadecimal precedidas port 0x ou 0X (0x1, 0xA, 0xFF02) ou seqüências de caracteres em octal precedidas por 0 (sim! um zero à esquerda! p.ex. 01, 023, 0456). Os literais inteiros podem apresentar como sufixo a letra L maiúscula ou minúscula, neste caso o literal inteiro passa a ser do tipo long (p. ex. 23L, OXAL, 026L). Os literais inteiros podem designar valores para variáveis do tipo int, long, short, byte e char.
A linguagem Java tem regras sobre quais literais com quais valores podem ser atribuidos a variáveis inteiras. O compilador faz as conversões necessárias e internamente todos valores são representados através de zeros e uns. O trecho de programa abaixo mostra uma inicialização ou iniciação e a impressão deste valor em diferentes bases:
O trecho acima imprime:
Os literais de ponto flutuante tem as seguintes partes: parte inteira, ponto decimal, parte fracionária, expoente e sufixo. O expoente, se presente, é indicado pela letra
e ou E seguido de um inteiro. Os literais de ponto flutuante podem designar valores para variáveis do tipo float e double. O maior literal do tipo float é 3.40282347E+38F, o menor positivo finito diferente de zero é 1.40239846E-45F. O maior literal double positivo é 1.79769313486231570E+308, o menor positivo diferente de zero é 4.94065645841246544E-324Os tipos float e double, segundo a recomendação do padrão IEEE 754 podem representar infinito. Não existem literais para infinito devem ser usadas expressões do tipo 1f/0f ou -1d/0d, outra opção é o uso de constantes prédefinidas:
Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY
Os literais float e double somente podem ser expressos na base dez.
Os literais de caracteres são sequências de caracteres entre apóstrofos. O literal correspondente à letra a minúscula é
'a', este é um exemplo de literal de um só caractere mas existe também a Seqüência de Escape. A representação da barra invertida: '\\', a representação de aspas '\"' e a representação do apostrofo: '\''. Alguns literais de caracteres representam caracteres que podem ser tratados de forma especial por alguns dispositivos de entrada e saída: '\n' (newline), '\t' (tabulation), '\b' (backspace), '\r' (return), '\f' (form feed). É importante entender que um caractere em um vídeo ou impressora, em geral, corresponde a um valor do tipo int, a linguagem Java possui o tipo char para poder explicitar que estamos tratando de um valor int que deve ser considerado como um caractere. Estes dois tipos têm similaridades mas são distintos! Considere o programa abaixo:Complete a tabela de compatibilidade de atribuição de literais e variáveis (faça os programas e verifique!) As colunas são os tipos de literais e as linhas representam os tipos de variáveis.
|
literal |
Integer |
Floating |
Boolean |
Character |
String |
Null |
|
byte |
ok |
|
|
|
x |
x |
|
short |
ok |
|
|
|
x |
x |
|
int |
ok |
|
|
|
x |
x |
|
long |
ok |
|
|
|
x |
x |
|
char |
|
|
|
ok |
x |
x |
|
float |
|
ok |
|
|
x |
x |
|
double |
|
ok |
|
|
x |
x |
|
boolean |
|
|
ok |
|
x |
x |
|
referência |
x |
x |
x |
x |
(*) |
ok |
(*) um literal String para poder ser atribuído a uma variável exige que a classe desta variável seja do tipo String ou descendente desta classe, isto será visto mais à frente na disciplina.
A linguagem Java permite algumas atribuições entre variáveis de tipos diferentes. Considere o trecho de programa abaixo:
Mas neste outro trecho há um problema:
A linguagem Java exige que, na atribuição de um valor de tipo menos restrito para uma variável de tipo mais restrito, seja usado, de forma explícita, um mecanismo denominado "elencamento" (cast). O "elenco" de valores de uma variável do tipo long é maior que o "elenco" de valores do tipo int. A linguagem Java exige que o programador explicite o elencamento do valor long para um valor int. Grosseiramente é como se a linguagem obrigasse o programador a declarar que ele sabe que aquela atribuição pode resultar em problemas, ou seja é mais uma medida de disciplinamento do programador.
A conversão em um elencamento envolve, em geral, abandonar alguns bits de mais alta ordem. No trecho abaixo a variável b é iniciada com um valor que no contexto do tipo short é negativo, mas que ao ser elencado perde alguns bits e passa a ser, no contexto do tipo byte, um valor positivo! No trecho abaixo o conteúdo de s é -134 e o conteúdo de b é 122.
Uma outra tabela trata da questão da atribuição entre variáveis de tipos primitivos diferentes. Considere a atribuição A=B; O tipo de A corresponde às linhas e o tipo de B corresponde às colunas. Complete a tabela abaixo, onde inválido significa que a linguagem não permite a atribuiçao nem mesmo com o uso de elencamento (cast), auto significa que a conversão é feito de forma implícita e elencar significa que a atribuição só é possível através do uso de elencamento.
|
A B- |
long |
int |
short |
char |
byte |
double |
float |
boolean |
|
long |
- |
auto |
auto |
auto |
auto |
elencar |
elencar |
inválido |
|
int |
elencar |
- |
|
|
|
|
|
inválido |
|
short |
elencar |
elencar |
- |
|
|
|
|
inválido |
|
char |
elencar |
elencar |
|
- |
|
|
|
inválido |
|
byte |
elencar |
elencar |
|
|
- |
|
|
inválido |
|
double |
auto |
auto |
|
|
|
- |
|
inválido |
|
float |
auto |
auto |
|
|
|
|
- |
inválido |
|
boolean |
inválido |
inválido |
inválido |
inválido |
inválido |
inválido |
inválido |
- |
Observe que a linguagem Java não permite a mistura do tipo boolean com nenhum outro tipo. Em algumas linguagens, como por exemplo C e C++ é permitido tratar valores booleanos como sendo inteiro e vice-versa. Nestas linguagens o valor false corresponde ao valor zero (zero inteiro) e o valor true a valores diferentes de zero.
Exercícios:
Um dos problemas enfrentados por quem aprende novos conceitos são as colisões de representação. Na linguagem Java um símbolo tal como como o
Escreva um programa em Java que ilustra o que foi dito acima.