Nomes


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.
 

Expressões


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
()
 

Precedência

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=________________________;