RSS

JP – Operator and Assignments Questions – Soluciones y Explicacion

25 Ago

Seguimos con las Questions de JavaPrepare. En este caso las relativas a operadores y asignaciones. Si quereis realizar el test con tranquilidad sin ver la solución debajo de cada pregunta, se encuentra en JavaPrepare – Operators and Assignments Questions.

Las preguntas de este test tratan sobre las asignaciones y los distintos operadores en Java: aritméticos, de comparación, condicionales, a nivel de bits y lógicos, incrementales, de asignación, etcétera… También es importante conocer la prioridad y la asociatividad de los operadores.

Para pasar a las soluciones y explicación del test haced click en “Read the rest of this Entry”.

1. In the following class definition, which is the first line (if any) that causes a compilation error. Select the one correct answer.

public class test {
    public static void main(String args[]) {
        char c;
        int i;
        c = 'A';     //1
        i = c;       //2
        c = i + 1;   //3
        c++;         //4
    }
 }

a) The line labeled 1.
b) The line labeled 2.
c) The line labeled 3.
d) The line labeled 4.
e)  All the lines are correct and the program compiles.

a) Incorrecta. La línea 1 no produce fallo ya que es la asignación de un literal char en una variable char.
b) Incorrecta. La línea 2 no produce fallo ya que en un entero si cabe un char. (grande = pequeño no falla)
c) Incorrecta. La línea 3 produce fallo ya que en un char no cabe un entero. Necesita cast explícito.
d) No falla. Se puede incrementar un char.

2. Which of these assignments are valid. Select the four correct answers.
a) short s = 28;
b) float f = 2.3;
c) double d = 2.3;
d) int I = ‘1’;
e) byte b = 12;

a) c) d) e) Correctas. Los literales enteros son int por defecto pero el compilador al comprobar que no sobrepasan el rango del tipo convierte automáticamente.
b) Incorrecta. Por defecto un literal con parte decimal es un double. Cuando se asigna un double a un float siempre dará error de compilación a no ser que se haga un cast o se añada el sufijo f. 

Ampliando este tema: hilo en coderanch
Conversiones en JLS book

3. What gets printed when the following program is compiled and run. Select the one correct answer.

class test {
    public static void main(String args[]) {
        int i,j,k,l=0;
        k = l++;
        j = ++k;
        i = j++;
        System.out.println(i);
    }
}

a) 0
b) 1
c) 2
d) 3

En la inicialización l=0.
En la instruccion k = l++; primero se evalua y luego se incrementa l, por lo tanto k = 0.
En j=++k; primero se incrementa y luego se evalua, entonces j = 1.
En i=j++; primero se evalua y luego se asigna, entonces i =1.
La opción correcta es b).

4. Which of these lines will compile? Select the four correct answers.
a) short s = 20;
b) byte b = 128;
c) char c = 32;
d) double d = 1.4;
e) float f = 1.4;
f) byte e = 0;

Las correctas son a),c), d) f)
b) Falla porque 128 no cabe en un byte y no puede hacer la conversión automáticamente, se necesita cast. El rango de los bytes va desde -128 a 127.
c) Falla porque por defecto 1.4 es double y necesita casting o sufijo f.

5. The signed right shift operator in Java is –. Select the one correct answer.
a) <<;
b) >>;
c) >>>;
d) None of these.

a) Incorrecta. Es el desplazamiento con signo a la izquierda.
b) Correcta. Es el desplazamiento con signo a la derecha.
c) Incorrecta. Es el desplazamiento sin signo a la derecha.

6. What gets printed on the standard output when the class below is compiled and executed. Select the one correct answer.

public class ShortCkt {
    public static void main(String args[]) {
        int i = 0;
        boolean t = true;
        boolean f = false, b;
        b = (t && ((i++) == 0));
        b = (f && ((i+=2) > 0));
        System.out.println(i);
    }
}

a) 0
b) 1
c) 2
d) 3

La opción correcta es b), imprime 1. Hay que darse cuenta que en la instrucción 7 al ser un AND con evaluación perezosa y al ser primera parte ya falsa (f) la segunda parte ((i+=2)>0) no se evalua y por lo tanto no incrementa la variable i.

7. What gets printed on the standard output when the class below is compiled and executed. Select the one correct answer.

public class ShortCkt {
    public static void main(String args[]) {
        int i = 0;
        boolean t = true;
        boolean f = false, b;
        b = (t & ((i++) == 0));
        b = (f & ((i+=2) > 0));
        System.out.println(i);
    }
}

a) 0
b) 1
c) 2
d) 3

La correcta es d) imprime 3. Al evaluarse los AND sin evaluación perezosa la segunda parte de la condición se evalua siempre y hace que se incremente la variable i.

8. What gets printed on the standard output when the class below is compiled and executed. Select the one correct answer.

public class ShortCkt {
    public static void main(String args[]) {
        int i = 0;
        boolean t = true;
        boolean f = false, b;
        b = (t || ((i++) == 0));
        b = (f || ((i+=2) > 0));
        System.out.println(i);
    }
}

a) 0
b) 1
c) 2
d) 3

En la primera expresión el operador || no tiene que evaluar la segunda parte ya que la primera es verdadera e independientemente del valor de la segunda el OR ya es verdadero.
En la segunda expresión el operador || sí tiene que evaluar la segunda parte y es entonces cuando se incrementa la variable i, i = i +2. Por lo tanto la opción correcta es c) 2.

9. What gets printed on the standard output when the class below is compiled and executed. Select the one correct answer.

public class ShortCkt {
    public static void main(String args[]) {
        int i = 0;
        boolean t = true;
        boolean f = false, b;
        b = (t | ((i++) == 0));
        b = (f | ((i+=2) > 0));
        System.out.println(i);
    }
}

a) 0
b) 1
c) 2
d) 3

En este caso los operadores son | y no tienen evaluación perezosa entonces evaluará siempre la segunda parte de las expresiones. Por tanto, en la línea 7, i se incrementa, i = 1, y en la línea 8, i+=2, i = 3.
La opción correcta es d) 3.


10. Which operator is used to perform bitwise inversion in Java. Select the one correct answer.

a) ~
b) !
c) &
d) |
e) ^

La correcta es a) ~. Es la operacion NOT o complemento.
b) Es la negación pero para expresiones lógicas y no como operador de bits.
c) Es el AND.
d) Es el OR.
e) Es el XOR.

11. What gets printed when the following program is compiled and run. Select the one correct answer.

public class test {
    public static void main(String args[]) {
        byte x = 3;
        x = (byte)~x;
        System.out.println(x);
    }
}

a) 3
b) 0
c) 1
d) 11
e) 252
f) 214
g) 124
h) -4

En binario 3 sería 00000011, aplicandole el operador  nos daría 11111100. ¿qué decimal es 11111100? Ver este hilo de coderanch.

La opción correcta es la h) -4.

12. What gets displayed on the screen when the following program is compiled and run. Select the one correct answer.

public class test {
    public static void main(String args[]) {
        int x,y;
        x = 3 & 5;
        y = 3 | 5;
        System.out.println(x + " " + y);
    }
}

a) 7 1
b) 3 7
c) 1 7
d) 3 1
e) 1 3
f)  7 3
g) 7 5

Hagamos la operación & entre 3 y 5. Y hacemos la operación | entre 3 y 5.
011                                                                011
&  101                                                         |  101
————                                                       ———-
001  Nos da 1.                                                 111   Nos da 7.

La opción correcta es c) Imprime 1 7

13. What gets displayed on the screen when the following program is compiled and run. Select the one correct answer.

public class test {
    public static void main(String args[]) {
        int x,y;
        x = 1 & 7;
        y = 3 ^ 6;
        System.out.println(x + " " + y);
    }
}

a) 1 3
b) 3 5
c) 5 1
d) 3 6
e) 1 7
f) 1 5

Hacemos las operaciones:
001 & 111 = 001  -> x = 1
011 ^  110 = 101  -> y = 5  (La operación es XOR, cierta cuando los bits son diferentes)
La opción correcta es f) imprime 1 5.

14. Which operator is used to perform bitwise exclusive or.
a) &
b) ^
c) |
d) !
e) ~

La opción correcta es b) ^.
a) es AND, c) OR, d) NOT logico, e) NOT bits

15. What gets displayed on the screen when the following program is compiled and run. Select the one correct answer.

public class test {
    public static void main(String args[]) {
        boolean x = true;
        int a;
        if(x) a = x ? 1: 2;
        else a = x ? 3: 4;
        System.out.println(a);
    }
}

a) 1
b) 2
c) 3
d) 4

El código anterior equivaldría a:

 boolean x = true;
 int a;
 if(x)  a = (x ? 1: 2);  // x es true, ejecuta esta rama.
                         // "x ?1:2" significa si x es true devuelve 1 si no 2.
 else a = (x ? 3: 4);
System.out.println(a);

Por lo tanto la opción correcta es a) 1.

16. What gets displayed on the screen when the following program is compiled and run. Select the one correct answer.

public class test {
    public static void main(String args[]) {
        boolean x = false;
        int a;
        if(x) a = x ? 1: 2;
        else a = x ? 3: 4;
        System.out.println(a);
    }
 }

a) 1
b) 2
c) 3
d) 4

El código anterior equivaldría a:

boolean x = false;
 int a;
 if(x)  a = (x ? 1: 2);
 else a = (x ? 3: 4); // x es false, ejecuta esta rama.
                      //"x ?3:4" significa si x es true devuelve 3 si no 4.
System.out.println(a);

Por lo tanto x = 4, la opción correcta es d)

17. What gets displayed on the screen when the following program is compiled and run. Select the one correct answer.

public class test {
    public static void main(String args[]) {
        int x, y;
        x = 5 >> 2;
        y = x >>> 2;
        System.out.println(y);
    }
 }

a) 5
b) 2
c) 80
d) 0
e) 64

Para empezar tenemos 5 en binario para un int (4 bytes) y he colocado los bits entre unos simbolitos | | para poder ver mejor los desplazamientos:
|00000000 00000000  00000000 00000101|

Nos piden un desplazamiento de 2 a la derecha, por lo tanto desplazamos:
|??000000 00000000 00000000 00000001|01
Nos quedan dos huecos dentro por rellenar y ha salido fuera un ’01’.
Como es un desplazamiento a la derecha con signo, como el numero es positivo, los huecos los tenemos que rellenar con ceros. Y quedaría así:
|00000000 00000000 00000000 00000001|

Segundo nos piden a partir de aquí un desplazamiento de 2 sin signo:
|??000000 00000000 00000000 00000000|01
Nos quedan dos huecos por rellenar y ha salido fuera un ’01’.
Como es un desplazamiento a la derecha sin signo siempre se rellena con ceros. Queda así:
|00000000 00000000 00000000 00000000|

La opción correcta es d) 0.

18. What gets displayed on the screen when the following program is compiled and run. Select the one correct answer.

public class test {
    public static void main(String args[]) {
        int x;
        x = -3 >> 1;
        x = x >>> 2;
        x = x << 1;
        System.out.println(x);
    }
}

a) 1
b) 0
c) 7
d) 5
e) 23
f) 2147483646

Los enteros en Java se encuentran internamente almacenados en complemento a 2. Para un número positivo coincide con su representación binaria. Para los números negativos es necesario invertir su representación binaria y sumar uno.

Por ejemplo, -3 en binario (como es int son 4 bytes) sería:
00000000 00000000  00000000 00000011
Se negaría:
11111111 11111111 11111111 11111100
Y luego se sumaría 1:
11111111 11111111 11111111 11111101

Entonces a -3 se le hace un desplazamiento a la derecha de 1:
|?1111111 11111111 11111111 11111110|1
El hueco al ser un desplazamiento con signo y ser el número negativo se rellena con uno. Y al desplazar queda fuera un ‘1’
Quedaría: |11111111 11111111 11111111 11111110|

A partir de aquí nos piden un desplazamiento a la derecha sin signo de 2.
|??111111 11111111 11111111 11111111|10
Como es sin signo se rellena con ceros.
Queda:
|00111111 11111111 11111111 11111111|

Y finalmente un desplazamiento a la izquierda de 1:
0|01111111 11111111 11111111 1111111?|
Los desplazamientos a la izquierda siempre se rellenan con ceros.
Queda:
|01111111 11111111 11111111 11111110| que pasandolo a decimal es 2147483646.

La opción correcta es f)2147483646.

19. Which of the following are correct. Select all correct answers.
a) Java provides two operators to do left shift – << and <<<.
b) >> is the zero fill right shift operator.
c) >>> is the signed right shift operator.
d) For positive numbers, results of operators >> and >>> are same.

a) Incorrecto. Java solo provee un operador de desplazamiento a la izquierda, <<.
Sí proporciona dos operadores de desplazamiento a la dercha, >>, >>>.
b) Incorrecto. Si el número es negativo se rellena con unos.
c) Incorrecto. El el desplazamiento a la derecha sin signo.
d) Correcta. Si el número es positivo >> rellenará con ceros y >>> siempre rellena con ceros.

20. What is the result of compiling and running the following program. Select one correct answer.

public class test {
    public static void main(String args[]) {
        int i = -1;
        i = i >> 1;
        System.out.println(i);
    }
}

a) 63
b) -1
c) 0
d) 1
e) 127
f) 128
g) 255

Queda el mismo número ya que -1 sería 4 bytes de unos: 11111111 11111111 11111111 11111111
Si desplazamos meteremos un 1 por delante y saldrá un 1 por detrás por lo cual queda el mismo número.
Sería la opción b) -1.

21. What all gets printed when the following gets compiled and run. Select the two correct answers.

public class example {
    public static void main(String args[]) {
        int x = 0;
        if(x > 0) x = 1;

        switch(x) {
               case 1: System.out.println(1);
               case 0: System.out.println(0);
               case 2: System.out.println(2);
               break;
               case 3: System.out.println(3);
               default: System.out.println(4);
               break;
        }
    }
}

a) 0
b) 1
c) 2
d) 3
e) 4

Imprime a) 0 y c) 2. Entra en el case 0 al no haber break pasa al case 2 y ahí si sale con un break.

22. What happens when the following class is compiled and run. Select one correct answer.

public class test {
    public static void main(String args[]) {
        int x = 0, y = 1, z;
        if(x)
          z = 0;
        else
          z = 1;

        if(y)
          z = 2;
        else
          z = 3;
        System.out.println(z);
    }
}

a) The program prints 0
b) The program prints 1
c) The program prints 2
d) The program prints 3
e) The program does not compile because of problems in the if statement.

La opción correcta es e) Se produce error de compilación porque no se puede tratar un entero como si fuera un lógico. Se espera un tipo boolean.

23. Which all lines are part of the output when the following code is compiled and run. Select the nine correct answers.

public class test {
    public static void main(String args[]) {
         for(int i = 0; i < 3; i++) {
            for(int j = 3; j >= 0; j--) {
                if(i == j) continue;
                System.out.println(i + " " + j);
            }
         }
     }
 }

a) 0 0
b) 0 1
c) 0 2
d) 0 3
e) 1 0
f) 1 1
g) 1 2
h) 1 3
i) 2 0
j) 2 1
k) 2 2
l) 2 3
m) 3 0
n) 3 1
o) 3 2
p) 3 3
q) The program does not print anything.

Seguimos la traza de los bucles. i recibirá valores del 0 al 2. j recibirá valores del 3 al 0.
Saltará a la siguiente iteración sin imprimir si i y j tienen el mismo valor.
Por lo tanto m) n) o) p) q) descartados porque i no puede tener valor 3 y porque el programa imprime resultados.
Descartamos las opciones con los valores i y j iguales:  a) f) k)
Las correctas son b) c) d) e) g) h) i) j) l)

Siguiendo la traza imprimiría en este orden:
0 3
0 2
0 1
1 3
1 2
1 0
2 3
2 1
2 0

24. Which all lines are part of the output when the following code is compiled and run. Select the one correct answer.

public class test {
     public static void main(String args[]) {
        for(int i = 0; i < 3; i++) {
           for(int j = 3; j <= 0; j--) {
              if(i == j) continue;
              System.out.println(i + " " + j);
           }
        }
     }
}

a) 0 0
b) 0 1
c) 0 2
d) 0 3
e) 1 0
f) 1 1
g) 1 2
h) 1 3
i) 2 0
j) 2 1
k) 2 2
l) 2 3
m) 3 0
n) 3 1
o) 3 2
p) 3 3
q) The program does not print anything.

La opción correcta es q). No se imprime nada ya que en el segundo bucle no se cumple la condición nunca, j se inicializa en 3 y nunca es <=0.

25. Which all lines are part of the output when the following code is compiled and run. Select the six correct answers.

public class test {
    public static void main(String args[]) {
        for(int i = 0; i < 3; i++) {
            for(int j = 3; j >= 0; j--) {
                if(i == j) break;
                System.out.println(i + " " + j);
            }
        }
    }
}

a) 0 0
b) 0 1
c) 0 2
d) 0 3
e) 1 0
f) 1 1
g) 1 2
h) 1 3
i) 2 0
j) 2 1
k) 2 2
l) 2 3
m) 3 0
n) 3 1
o) 3 2
p) 3 3

En este programa la primera vez que i y j sean iguales se acabará el bucle ya que para esa condición tiene un break. Por lo tanto, se llegaría a imprimir 03 02 01, para 00 se ejecutaría el break del bucle interno. Comenzaría la segunda iteración, imprimiría 13 12, para 11 se ejecutaría el break. Comenzaría la tercera iteración, imprimiría 23, para 22 se ejecuta el break y acaba el bucle externo. Entonces las opciones correctas son b) c) d) g) h) l)

26. Which all lines are part of the output when the following code is compiled and run. Select the six correct answers.

public class test {
  public static void main(String args[]) {
   outer: for(int i = 0; i < 3; i++) {
            for(int j = 3; j >= 0; j--) {
                 if(i == j) continue outer;
                     System.out.println(i + " " + j);
                 }
            }
  }
}

a) 0 0
b) 0 1
c) 0 2
d) 0 3
e) 1 0
f) 1 1
g) 1 2
h) 1 3
i) 2 0
j) 2 1
k) 2 2
l) 2 3
m) 3 0
n) 3 1
o) 3 2
p) 3 3

En este programa tenemos una etiqueta outer: que nos lleva al primer bucle y la sentencia interior de los dos bucles tenemos un continue outer, que hará que si i y j son iguales salte al primer bucle, por lo tanto en este caso se comportaría igual que el ejercicio anterior con el break.
Imprime los mismos resultados. Opciones correctas b) c) d) g) h) l).

27. Which all lines are part of the output when the following code is compiled and run. Select the three correct answers.

public class test {
    public static void main(String args[]) {
        outer : for(int i = 0; i < 3; i++) {
                    for(int j = 3; j >= 0; j--) {
                         if(i == j) break outer;
                           System.out.println(i + " " + j);
                    }
                }
    }
 }

a) 0 0
b) 0 1
c) 0 2
d) 0 3
e) 1 0
f) 1 1
g) 1 2
h) 1 3
i) 2 0
j) 2 1
k) 2 2
l) 2 3
m) 3 0
n) 3 1
o) 3 2
p) 3 3

En este caso dentro del segundo bucle si i y j son iguales hace un break outer, que hace que la ejecución pare al salir del primer bucle. Imprimiría entonces 03 02 02 y en 00 saldría de los dos bucles.
Las opciones correctas son b) c) d.

Anuncios
 
4 comentarios

Publicado por en 25 agosto, 2011 en Examen, Preguntas

 

Etiquetas: , , ,

4 Respuestas a “JP – Operator and Assignments Questions – Soluciones y Explicacion

  1. Juan

    22 noviembre, 2011 at 8:04 pm

    Hola Virginia!

    Si si que entra jejeje, ójala tampoco entrase ehhh!
    Si tienes el PDF del libro de Kathy Sierra y Bert Bates y te posicionas en la hoja 497 (del visor pdf) o 459 (del número de hoja impreso) verás como el objetivo 3.3 es el de la serialización:

    “3.3 Develop code that serializes and/or de-serializes objects using the following APIs from
    java.io: DataInputStream, DataOutputStream, FileInputStream, FileOutputStream,
    ObjectInputStream, ObjectOutputStream, and Serializable”

    Prepararse para el examen es jodido, no es porque sea imposible de aprender el temario, si no porque entra todo de golpe. Me ocurre que me estudio un tema, hago test y hago ejemplos escribiendo código y todo va bien, saco porcentajes altos de acierto… pero entonces paso de tema y lo que había aprendido del capítulo anterior el 30 % ha desaparecido de la mente jajajaa se ha auto-formateado

    Si fuera un exámen por temas estaría facilísimo, hombre tendrías que estudiar pero es algo asequible para la mente humana, pero tener todo absolutamente todo ahí arriba y que el día del examen vayas con una seguridad que te permita responder preguntas sin dudas y sin decir, <> es difícil y requiere tiempo y entrenamiento.

    Vamos que hay que volver a practicar cada capítulo al menos dos veces o tres para de manera secuencial ir almacenando todos los conceptos. Si no se hace así son tantas cosas que vas olvidando cosillas poco a poco.

    A parte no es como cuando estudias que tienes compañeros de clase jejeje, y comentas con ellos, uno te dice un truco otro te comenta otra cosilla que le va bien para aprender una determinada parte del temario… aquí parece que te estas preparando tu solo en todo el planeta a este examen.. es un poco desolador jejeje

    menos mal que hay blogs como este donde uno puede comunicarse con más gente que está intentando aprobar “este extraño examen” 😉

    Si vienes del mundo microsoft (.net) concretamente como es mi caso no es un exámen que se apruebe en dos días, espero al menos que el esfuerzo que se hace por aprobarlo se reconozca en la industria.

    Saludos!

     
    • Virginia Lopez

      23 noviembre, 2011 at 8:50 am

      Buenas, Juan!!
      La verdad es que el examen es complicado porque en las preguntas suelen mezclar dos o tres conceptos y hay que llevarlo muy muy preparado. Cuando he leído a gente en los foros que se ha presentado siempre comentaban que lo hacían cuando en los tests hacían por lo menos un 80% de aciertos o más…

      Ah, y el tema de Serialización no te preocupes que no entra. En el libro viene porque estaba antes como objetivo pero en el cambio de examen con Oracle lo han quitado. He preguntado a algunos conocidos que han hecho el examen hace poco y no había ninguna pregunta de serialización.

      En los Exam Topics lo he buscado y tampoco aparece.

      Así que una cosa menos 😀

      Al principio intentamos unos chicos y yo hacer un grupo de estudio así en la distancia. Nos envíabamos correos y nos poníamos fechas topes para estudiar y hacer ejercicios o exámenes pero la verdad que no es lo mismo… Lo que tú dices, te parece que estás más solo que la 1 estudiando esto pero echándole su tiempo lo sacaremos y merecerá la pena 🙂

      Un saludo!!

       
  2. Virginia Lopez

    19 noviembre, 2011 at 11:56 am

    Hola Juan!
    Es verdad que estos operadores de desplazamiento de bits ya no entran en el examen. Creo que el cuestionario es de la versión anterior donde todavía entraban.

    Mejor que quiten cosillas 😀 La serialización creo que tampoco entra.

    Gracias por pasarte! Un saludo.

     
  3. Juan

    18 noviembre, 2011 at 6:12 pm

    Muy buen trabajo, me han venido bien para repasar algunos conceptos. Solo una cosa, según oracle estos son solo los operadores que entran:

    Asignación ( =, +=, -=)
    Aritméticos (+, -, *, /, %, ++, –),
    Relacionales ( <, , >=, ==, !=)
    Operador instanceof
    Lógicos ( &, |, ^, !, &&, ||)
    Operador ternario (? 🙂

    Te comento esto porque hay muchos ejercicios de desplazamiento de bits (<>>, etc…) y no entra en el examen según Sun (bueno, oracle… 😉 )

    Tampoco el uso de & , | y ^ a nivel de bits, así lo dice Oracle:

    “The &, |, and ^ operators can all be used in two different ways, although as
    of this version of the exam, their bit-twiddling capabilities won’t be tested.”

    Por otra parte yo siempre he conocido && y || como operadores de cortocircuito, jejeje muy graciosa la definición que propones para ellos, “perezosos” en realidad el nombre le viene que ni al pelo.

    Un saludo

     

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: