Porque acontece isso?

4 respostas
wbsouza

What will happen when you invoke the following method?

1:    void infiniteLoop()
2:    {
3:        byte b = 1;
4:
5:        while ( ++b > 0 )  // o resultado da expressão é -128
6:            ;
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.

4 Respostas

caiofilipini

B) Prints “Welcome to Java”.

[]'s

wbsouza

OK, está correto. Espantoso? é o seguinte:

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. :smiley:

C

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.

Criado 19 de julho de 2003
Ultima resposta 20 de jul. de 2003
Respostas 4
Participantes 4