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???
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?!?!?!
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…
Realmente sua explicação é o que acontece no Java, fiz um programinha para testar.
public class ClasseTeste {
public static void main(String[] args) {
int y =5;
int x =2;
if (Verdadeiro("1") && Verdadeiro("2") | Verdadeiro("3")) {
System.out.println("Portal Java");
}
}
private static boolean Verdadeiro(String a){
System.out.println(a);
return false;
}
}
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?