What will happen when you invoke the following method?
1:voidinfiniteLoop()2:{3:byteb=1;4:5:while(++b>0)//oresultadodaexpressãoé-1286:;7:System.out.println("Welcome to Java");8:}
A) The loop never ends(infiniteLoop).
B) Prints “Welcome to Java”.
C) Compilation error at line 5. ++ operator should not be used for byte type variables.
D) Prints nothing.
O loop vai executar de 1 até chegar ao limite do byte (127), e quando adicionar mais um irá ocorrer um overflow, mas o java não gera exceção para isto :(, ou seja, o bit de sinal será setado e o numero passará a ser tratado como negativo e o fluxo do programa sairá do loop e irá imprimir "Welcome to Java"
b = 127 ou seja b em binario = 01111111
pois: b + 1:
01111111 +
00000001
10000000 = -128
Tá aí a explicação desta pegadinha (que pode ocorrer na prova)
[]s, Welington B. Souza
TaQ
Essa foi bem bolada.
C
CLAUDIO_GUALBERTO
Java não gera execptions para isto por que não deveria gerar. Esse comportamento já existe desde os primordios da computação, e na verdade é muito utilizado, principalmente em linguagens onde se tem um controle maior da parte “baixa” de um software, como C e Assembly, e também deve ser bem utilizado pela JVM.
Para se fazer um “zero fill” de um frame de memoria, alguns compiladores fazem, ao invéz de uma comparação com um inteiro que define o tamanho do frame ( que geralmente era uma palavra de máquina ), um teste na flag “zero” do conjunto de registradores da maquina, que é um opcode muito menor e ,logico, mais rápido.