Os nomes em Java consistem de seqüências de caracteres iniciadas com letras. Os
caracteres válidos são letras e dígitos e o sublinhado. Vários elementos da
linguagem podem ter nomes. Os nomes podem ser definidos no escopo de elementos
que também podem ter nomes. A seleção de um nome B no espaço de nomes A é
representada pela expressão A.B onde o ponto é denominado operador de seleção.
A identificação de um elemento pode ser feita com um nome simples ou
composições de nomes denominados identificadores. A linguagem Java tem
regras sobre quando deve ser utilizada a composição completa de nomes de um
elemento e quando podemos utilizar um nome simples.
O identificador System.out.println consiste em três nomes, o nome out é selecionado no espaço de nomes System e o nome println é selecionado no espaço de nomes out.
O identificador Math.PI consiste em dois nomes, o nome PI é selecionado no espaço de nomes Math.
Uma expressão corresponde a um trecho de programa que calcula um certo valor e
ainda pode produzir efeitos colaterais. As expressões podem ser utilizadas em
vários pontos de um programa. O valor produzido por uma expressão tem associado
a ele um certo tipo. As expressões mais simples correspondem a um
literal ou uma variável e neste caso o tipo da expressão (ou tipo do valor
retornado) corresponde ao tipo do literal ou ao tipo da variável.
Exemplos:
Uma expressão pode ser usada no lado direito de um comando de atribuição:
<variavel = <expressao; O tipo da variável e o tipo da expressão têm que
ser "compatíveis".
int a;
a=3; /* a expressão corresponde a uma constante representada por um literal */
double b;
b=Math.PI; /* expressão corresponde a uma variável prédefinida contendo
como valor uma aproximação de Pi */
double c=2.;
double d;
d=c; /* a expressão corresponde a uma variável */
Conforme dito acima uma
expressão pode corresponder a um literal ou uma variável; uma expressão pode
correponder ainda a uma chamada de função ou método ou ainda a uma combinação
de literais, variáveis e chamadas de métodos combinadas através de
"operadores". Existem ainda várias outras maneiras de definir
expressões que serão vistas mais à frente na disciplina.
Uma chamada de funcão ou
método corresponde a um desvio do fluxo de execução para um trecho de código
que irá calcular um valor e retorná-lo no ponto em que o fluxo de controle
também retorna. Cada função ou método tem 0, 1 ou mais argumentos na sua
definição. O compilador verifica se existe uma expressão para cada argumento do
método invocado. A sintaxe para o conjunto de argumentos consiste em uma lista
de expressões separadas por vírgula e delimitada por abre e fecha parênteses.
Exemplos de expressões
correspondentes a chamadas de métodos:
int a;
a=Math.max(v1,v2); /* retorna o maior argumento, corresponde a
int b;
b=Math.max(Math.max(v1,v2), Math.max(v3,v4));
Na expressão
Math.max(Math.max(v1,v2), Math.max(v3,v4))
temos duas chamadas de um método aninhada dentro de uma outra chamada de
método. Quando o fluxo de controle atinge uma chamada de método, primeiro são
avaliadas as expressões correspondentes aos argumentos do metodo, depois então
é que é feito o salvamento do ponto de retorno do fluxo de controle e o desvio
para o código do método. A execução normal de um método termina com o método
retornando o fluxo de controle para o ponto de retorno salvo juntamente com o
retorno do valor calculado. As expressões correspondentes aos argumentos são
calculadas da esquerda para a direita.
Considere o que foi dito
acima e descreva o valor impresso no seguinte trecho de programa:
int i=2;
int j=3;
System.out.println(Math.max(i=3,i+j));
Conforme já discutido, um
comando de atribuição corresponde a (i)uma variável, o (ii)símbolo
"=" e (3)uma expressão; Quando o fluxo de controle atinge um comando
de atribuição o valor da expressão é calculado e atribuído à variável, além
disso o comando de atribuição tem associado a ele um valor que é exatamente o
valor da expressão, é isso que permite aparecer em um programa expressões do
tipo: v1=v2=3;
Operadores
Constantes, variáveis e
chamadas de função podem ser combinadas com operadores para construir
expressões mais complexas. Alguns operadores são bastante intuitivos. Considere
o seguinte trecho de programa:
int i=2;
int j=3;
int k;
k=i+j;
O operador "+" na expressão acima corresponde a uma soma de valores
do tipo int.
Operadores aritméticos
+ - * / %
Operadores de incremento e
decremento
++ --
Exemplos:
int i=3;
i++; ++i; i--; --i;
Operadores relacionais
== != < <= =
Exemplos:
int a=3;
int b=4;
boolean c=a==b; // inicializa a variavel
c com false
boolean d=a!=b; // inicializa a variavel d com true
c=a<b; //atribui true a variavel c
Operadores Lógicos ou
Booleanos
&
&& | || !
Exemplos:
boolean a=true;
boolean b=false;
boolean c=a&b; //inicializa c com valor false
boolean d=a|b; //inicializa d com valor true
Operador condicional
?:
Operadores de atribuição
= += -= *= /= %= &= != |= &&=
||=
Operadores de elencamento
()
O trecho de programa abaixo
deve ser evitado por um bom programador. Mas (infelizmente) tal trecho pode ser
formulado. O que é impresso pelo trecho abaixo?
int i=2;
int j=(i=3)*i;
System.out.println(j);
Considere a tabela abaixo. Operadores na mesma linha têm igual precedência,
operadores nas linhas superiores têm precedência sobre operadores nas linhas
inferiores:
|
Operadores unários |
++ |
-- |
! |
- |
+ |
elencamento |
|
Multiplicação etc |
* |
/ |
% |
|
|
|
|
soma etc |
+ |
- |
|
|
|
|
|
relacionais |
< |
|
<= |
= |
|
|
|
igualdade, desigualdade |
== |
!= |
|
|
|
|
|
e |
& |
&& |
|
|
|
|
|
ou |
| |
|| |
|
|
|
|
|
condicional |
?: |
|
|
|
|
|
|
atribuição |
= |
+= |
-= |
*= |
%= |
etc. |
|
|
|
|
|
|
|
|
Existem
ainda vários outros tipos de operadores que serão discutidos ao longo da
disciplina. Alguns deles poderiam ser discutidos desde já, tais como os
operadores de deslocamento (<<, >>, >>>), outros
operadores serão discutidos em um contexto bem especializado, tais como o
operador de comparação de tipo (instance of).
Um dos
problemas que devem ser enfrentados com expressões envolvendo os tipos double e
float são os erros de erredondamento. Por mais surprendente que seja o seguinte
trecho de programa em Java:
double d1=1.03-0.42, d2=0.61;
boolean b=(d1==d2);
resulta na
atribuição do valor false para b. Devemos evitar o uso do operador ==
envolvendo valores do tipo double ou float. Complete o trecho de programa
abaixo que implementa uma comparação mais adequada entre dois valores do tipo
double. O resultado deve ser true caso o valor absoluto da diferença
entre d1 e d2 seja menor que o conteúdo de precisao e false no caso contrário. Dica: o método Math.abs()
devolve o valor absoluto do argumento.
double d1=um
valor;
double d2=outro
valor;
double precisao=outro
valor;
boolean
aproxiimadamenteIguais=________________________;