Trabalhando com operadores

Oi

Pessoal, uma boa pegadinha pra quem está estudando para a certificação, vamos ver se vcs acertam essa:

Supondo que tenhamos um método Verdade() que sempre retorne true

Primeiro teste: int y =5; int x =2; if (((x > 3) && (y < 2)) | Verdadeiro()) { System.out.println("Portal Java"): }

Segundo teste: int y =5; int x =2; if ((x > 3) && (y < 2) | Verdadeiro()) { System.out.println("Portal Java"): }

A impressão acontecerá em qual dos testes??? E pq???

T+

A impressão ocorrerá no primeiro teste.

No primeiro teste, o conteúdo dos parenteses será avaliado primeiro, pois tem maior precedência sobre o operador |. E com esse resultado será feito o | (ou) com o resultado de Verdadeiro().

No segundo teste, primeiro será avaliado o resultado dos parênteses, depois o resultado de (y < 2) | Verdadeiro(), e por último será avaliado o resultado do &&, que sempre será falso, pq (x > 3) é falso. A precedência nesse caso é parênteses, | e &&.

Será que alguém vai entender minha explicação?!?!?!

Acho que enrolei tudo!!! :slight_smile:

Oi

Marcelo, é quase isso mesmo… Na primeiro teste vai impirmir pq ele está fazendo o teste do parentesis com o && com o método Verdadeiro(), mas como é | e o método sempre retorna verdadeiro vai dar certo…

No segundo testa não vai imprimir pq ele não faz por parentesis e sim com os dois operadores juntos… Como o && vem primeiro, ele o faz, viu que a primeira condição é falsa e ja abandona o resto, pq em && um falso é tudo falso, mas ele sequer testa o | no final…

T+

Oi jeveaux!

Realmente sua explicação é o que acontece no Java, fiz um programinha para testar.

public class ClasseTeste &#123;
	public static void main&#40;String&#91;&#93; args&#41; &#123;	
		int y =5;
		int x =2;
		if &#40;Verdadeiro&#40;&quot;1&quot;&#41; && Verdadeiro&#40;&quot;2&quot;&#41; | Verdadeiro&#40;&quot;3&quot;&#41;&#41; &#123;
		       System.out.println&#40;&quot;Portal Java&quot;&#41;;
		&#125;		
	&#125;
	
	private static boolean Verdadeiro&#40;String a&#41;&#123;
		System.out.println&#40;a&#41;;
		return false;
	&#125;
&#125;

Mas não entendi uma coisa. Pelo que eu li no livro do Deitel, o operador | tem precedência sobre &&. Se isso fosse verdade, ele deveria começar o teste pelo |, não é isso?
Parece que ele não respeitou essa regra de precedência, ou então os dois operadores tem a mesma precedência?

Se alguém puder me esclarecer melhor sobre isso…

[]'s
dhhp

Ps.: quem é Marcelo??? :stuck_out_tongue:

A ordem de avaliação é da esquerda para direita, e a de execução da direita para esquerda!
Estou certo?