Prova Certificação

17 respostas
maxguzenski

fazendo alguns simulados me deparei com a seguinte questão:

"QUAL A SAÍDA DO SEGUINTE CODIGO? "

public class Teste {

public static boolean metodo1(int i) {
    return (i>0)?true:false;
}  

public static void main(String[] args)

{
int i = 0;

boolean bool = false;
    boolean bool1 = true;
    boolean bool2 = false;

    bool = (bool1 & metodo1(i++));
    bool = (bool1 || metodo1(i++));

    bool = (bool2 | metodo1(i++));
    bool = (bool2 && metodo1(i++));

    System.out.println(i);
}

}

obs.: nao vale compilar e testar! :smiley:

17 Respostas

Alexandre

De acordo com minhas contas, acho que vai ser impresso que “i = 4”.
Estou certo, vou compilar pra testar…

marciolx

Tente de novo…
Lembre-se que os operadores && e || são short-circuit, isto é, avaliam apenas a primeira parte da expressão se o valor da segunda parte não importar no resultado final. Assim:

false && qualquercoisa = false
true || qualquercoisa = true

maxguzenski

bem… ainda nao é exatamente esta a resposta!
compilem! comenta as linhas com operadores & e | e veja a resposta
depois comentem os && e || e testem.

dreamspeaker

Essa é a típica pergunta da prova… se vc não se tocar, acaba prestando muita atenção em trechos do código que não servem pra nada no objetivo da questão…

E a resposta não é 4… cuidado com o short-circuit, como bem disse o marcio…

R

Os operadores & e | avalian bit a bit , portanto avaliam ambas as expressões . Os operadores && e || são do short circuit , e avaliam so a primeira expressão se o resulto da segunda não modificar o resultado final !!!

Estou certo ?

Um abraço a todos !!
Renato

maxguzenski

é isso mesmo.

marciolx

mancada, eu fiz confusão :oops: , onde escreví &, leia-se && e onde escreví | leia-se || respectivamente…
e um conselho: atenção redobrada durante a prova :!:

boaglio

Excelente questão maxguzenski!

Sempre que puder coloque mais algumas aqui no fórum!

[]'s

E

esta pegadinha é maneira, mandem mais!!!

S

Below is a explanation about this question. It’ll help you to understand how these operator work.

Boolean logical operators & | and ^
when both operands are boolean the result of the bitwise operators & | and ^ is a boolean
& - true if both operands are true, otherwise false
^ - true if both operands are different, otherwise false
| - false if both operands are false, otherwise, true

true & true   = true;       // both operands true
true & false  = false;      // one operand is false    

true ^ false  = true;       // both operands are different
true ^ true   = false;      // both operands are the same

true  | false = true;       // one operand is true
false | false = false;      // both operands are false

Conditional AND Operator &&
both operands must be boolean
result is a boolean
returns true if both operands are true, otherwise false
evaluates the right-hand operand only if the left-hand operand is true

true && true  = true;      // both operands evaluated
false && true = false;     // only left-operand evaluated
Conditional OR Operator || 

both operands must be boolean

result is a boolean

returns true if one of the operands is true

evaluates the right-hand operand only if the left-hand operands is false

false || true  = true;    // both operands evaluated

false || false = false;

true  || false = true;    // only lef-operand evaluated

true  || true  = true;

ie:

class TestLogical {

public static void main(String[] args) {

    boolean a = true;
    boolean b = true;
    boolean c = false;
    boolean d = false;
    
    System.out.println();
    System.out.println("Logical Operators:");
    System.out.println("------------------");
    System.out.println();
    System.out.println("	 true  & true  = 	 " + (a&b));
    System.out.println("	 true  & false = 	 " + (a&c));
    System.out.println("	 true  ^ false = 	 " + (a^c));
    System.out.println("	 true  ^ true  = 	 " + (a^b));
    System.out.println("	 true  | false = 	 " + (a|b));
    System.out.println("	 false | false = 	 " + (c|d));
    System.out.println();
    System.out.println("	 true  && true = 	 " + (a&&b));
    System.out.println("	 false && true = 	 " + (c&&a));
    System.out.println();
    System.out.println("	 false || true  = 	 " + (c||a));
    System.out.println("	 false || false = 	 " + (c||d));        
    System.out.println("	 true  || false = 	 " + (a||d));
    System.out.println("	 true  || true  = 	 " + (a||b));
    
}

}

P

kra tb gostei dessa. deu pra rever um monte de coisa em 3min. valew.

M

mas o resultado não é 4???

falaram que usando & e | é avaliada as duas expressões, e portando será executado o i++ 4 vezes…

al’guém me tira essa dúvida?

maxguzenski

sim, quem nao precisa avaliar as duas expressoes é o && e ||

marciolx

:oops: eu editei o post neste tópico onde fiz confusão com &,&& e |,|| eu havia me desculpado adiante neste mesmo tópico, mas corrigí para que ninguém faça confusão ao ler este fórum. Por um lado foi bom porque eu nunca mais vou me esquecer que os short circuit são && e || :wink:

P

eu ainda naum entendi pq da 2…

bool = (bool1 & metodo1(i++)); \i=1
bool = (bool1 || metodo1(i++)); \i=2

bool = (bool2 | metodo1(i++)); \i continua 2
bool = (bool2 && metodo1(i++)); \i=3

pq naum é assim?

dsuruagy

eu ainda naum entendi pq da 2…

bool = (bool1 & metodo1(i++)); i=1
bool = (bool1 || metodo1(i++)); i=2

bool = (bool2 | metodo1(i++)); i continua 2
bool = (bool2 && metodo1(i++)); i=3

pq naum é assim?

Você deve reparar que, na segunda linha, a chamada ao metodo1(i++) não é executada, justamente pelo operador || (short-circuit). Se bool1 já é true, então o resultado já é true, independentemente da chamada ao metodo1. Portanto i não é incrementado, permanecendo com o valor 1.
Na terceira linha, o i é incrementado, pois o operador | executa os dois operandos.
Na quarta, o metodo1 não é chamado, pois bool2 (false) && alguma coisa dá false.

Resultado i == 2 dá true. :lol:

P

é verdade, agora eu entendi. valew.

Criado 8 de maio de 2003
Ultima resposta 31 de mai. de 2003
Respostas 17
Participantes 11