Chapter II - Operators and Statements Flashcards
Ordem de operações no Java (OCA):
- Post-unary operators (expression++ ou – )
- Pre-unary operators (++ expression ou – )
- other unary operators (~, - (numero negativo), !)
- depois o padrão comum
Para valores inteiros, os resultados de divisões têm como base o “floor” do número resultante.
Ex: 10 / 3 = 3 (pegou a parte inteira do que seria o resultado quebrado).
Numeric Promotion Rules:
1 - Se duas variáveis têm tipos diferentes, a que tiver o menor tamanho será promovida para a que tem o tipo de maior tamanho.
Ex: long x + int y (y será promovida para long).
2 - Os tipos byte, short, e char serão sempre promovidas para int. Após isso pode haver outra promoção, caso a regra um se aplique (unary operators não se aplicam a essa regra, ex: short x++ ainda será um short).
*Obs: se eu tiver uma operação entre duas variáveis short, por exemplo, ainda assim o resultado será um int.
3 - Obviamente, o resultado de uma operação aritimética entre tipos diferentes, após as promoções, terá o mesmo tipo dos dois valores que foram utilizados na operação.
*Promoções também podem ocorrer entre um int e um número de ponto flutuante, óbvio!
int x + double y, vai resultar em um double.
Exemplo de tricky expression usando operadores unários:
int x = 3; int y = ++x * 5 / x -- + -- x; int y = 4 * 5 / x -- +-- x ; // step 1 int y = 20 / 4 + -- x // step 2 int y = 5 + 2 // step 3 int y = 7.
Obviamente, eu não consigo converter tipos maiores para menores. Ex:
long t = 123912391231923 //ele considera esse número um inteiro (precisaria do L).
short g = 23123123 //ele também considera esse número um inteiro.
A forma de eu conseguir fazer isso é por meio de casting. Ex:
long t = 123912391231923L
short g = (short) 23123123
Compound operators ( += e -=) fazem o cast necessário caso eu tente armazenar na variável um valor que seja de um tipo maior. Ex:
long x = 10;
int y = 3;
y *= x //vai fazer o cast do resultado para int.
Massa!
A diferença entre os operadores &, | e &&, || é que os primeiros fazem a verificação de todas as expressões enquanto o segundo só vai ao fim se for necessário, se ele ja “souber” que uma expressão não precisa ser alcançada, ele não irá até o fim.
Fazer uso dos short-circuit operators podem prevenir NullPointersExceptions por exemplo:
if ( x != null && x.getValue() < 5) { // se x for nulo, ele já entra no if e não lança exceção}
if ( x != null & x.getValue() < 5) { // se x for nulo, ele vai tentar fazer a segunda verificação e vai lançar exceção}
Lembrar que o Java não considera o “0” e o “1” como expressões booleanas.
O switch não pode receber variáveis do tipo boolean ou long.
Switches em Java só aceitam valores literais, enums ou constantes como parâmetro. Não posso passar para um switch uma variável que o Java não saiba seu valor.
Se eu não colocar breaks em meu cases de um switch, assim que ele der match em um dos cases, ele vai dar match em todos os outros depois desse até encontrar uma instrução break ou terminar o switch em si.
A instrução default de um bloco switch não precisa ser a última, o que faz ela ser executada por último não é sua posição, mas sim a expressão do switch não ter dado match em nenhum case.
Tipos de variáveis que o switch aceita como parâmetro:
- literals;
- constants enum;
- final constants variable.
Um “for” loop pode conter várias secções separadas por vírgula (na inicialização ou no update, não pode ter aonde fica a expressão booleana), ex:
for(int i = 0, int j = 10; i < 10; i++, j++; ) { }