Pegadinha - Controle de Fluxo

36 respostas
anderson.bonavides

public class Fluxo { public static void main(String[] args) { boolean x = true; boolean y = false; short z = 42; if((x == true)&&(y = true))z++; if((y == true)||(++z==44))z++; System.out.println(z); } }

Alguêm advinha qual é o resultado?

36 Respostas

victorwss

45

gilberto_oliveira

(y = true)
Já tinha visto isso na linguagem C

parece que está comparando y com true, mas em C eu diria que :

Acho que o java fez o mesmo, não foi?

anderson.bonavides

Sim o java atribuiu.

O que java não pode que C pode é fazer.

int c = 25; if(c){ //mais codigo aki. }
Java só aceita variaveis e comparacoes booleanas.

anderson.bonavides

E ai vai mais uma tentativa?

:wink:

gilberto_oliveira
<blockquote>

int c = 25;

if©{

</blockquote>Coisa de loco! :shock:
kaique

Eu acho que a resposta é 44.

[]'s.

davidbuzatto

43

public class Fluxo {  
     public static void main(String[] args) {  
         boolean x = true;  
         boolean y = false;  
         short z = 42;  
         
         // x é true, y recebe true = entra no if, z é incrementado (z = 43)
         if((x == true)&&(y = true))z++;  

         // como y é true, ++z == 44 não é executado (por causa do OR de curto circuíto)
         if((y == true)||(++z==44))z++;  
         System.out.println(z);  
     }  
}

Até mais!

davidbuzatto
<blockquote><div class="quote-author">gilberto_oliveira:</div><blockquote>

int c = 25;

if©{

</blockquote>Coisa de loco! :shock:</blockquote>

Não é coisa de louco não.
Em C++ tudo que é diferente de 0 ou que não é NULL representa true em uma operação condicional.

Até mais!

R

Eu acho que é 44 pois apesar de ele não entrar na condição do (++z == 44) o OR deu true, então ele pula e executa o z++ dentro do if.

joca_java

Corrigindo!

É como o cara falou!
É 44!

Ele vai entrar no primeiro IF por conta da atribuição no Y.

O segundo if ele entra sem avaliar a segunda expressão por conta do ||.
Já que a primeira já é verdadeira, não tem a necessidade de analisar a segunda porque é ||.

Até!

T

é verdade 44 só prestar atenção!

anderson.bonavides

A pessoal como a alguns já responderam. A resposta correta é 44.

:wink:

Raff

44 é o correto !!

G

aproveitando o tópico, gostaria de expor uma pequena alteração no código que faz uma grande diferença, principalmente pra quem está estudando para certificação.

public class Fluxo {  
     public static void main(String[] args) {  
         boolean x = true;  
         boolean y = false;  
         short z = 42;  
         if((x == true) && (y = true))z++;  
         if((y == true) | (++z==44))z++;  
         System.out.println(z);  
     }  
 }

Qual é o resultado ai?
Resposta 45
pois o if

if((y == true) | (++z==44))z++;

é avaliado dos dois lados por conta do operador “|”
[]´s a todos

LPJava

boa pegadinha essa o do |, || nesse caso ai teve o & mais é bom sabre a regra… heeh :D. aparece muita questao dessa e sempre envolvendo muitos for, while, o encademento… ter bastate atencao nas questoes de fluxo de controle as pegadinhas ficam bem desfarçadas… e ter atenção tb se compilam… acho uma das piores questoes…

davidbuzatto

Puts, pensei que não ia nem entrar na segunda expressão com o || :shock:, mas pelo jeito entra…

Raff
boolean x = true;
		boolean y = false;
		short z = 42;
		if((x == true)&&(y = true))z++;
		if((y == true)||(++z==44))z++;
		System.out.println(z);

na verdade não entra na segunda expressão do || o que acontece aqui é o seguinte… vamos fazer rastreamento do codigo…
no primeiro if x é igual a true && y recebe true.
logo entra em ação o primeiro if(ou seja o teste da verdadeiro)…incrementa o z para 43…
NO segundo if y é igual a true… logo não executa a segunda expressão pois para o operador || somente uma já sendo true ele não verificara o restante, logo o teste do if é true e entra no if e incrementa o z para 44.
no System.out.println(z)// imprimira 44

davidbuzatto
Raff:
boolean x = true;
		boolean y = false;
		short z = 42;
		if((x == true)&&(y = true))z++;
		if((y == true)||(++z==44))z++;
		System.out.println(z);
na verdade não entra na segunda expressão do || o que acontece aqui é o seguinte.. vamos fazer rastreamento do codigo.. no primeiro if x é igual a true && y recebe true. logo entra em ação o primeiro if(ou seja o teste da verdadeiro)..incrementa o z para 43.. NO segundo if y é igual a true.. logo não executa a segunda expressão pois para o operador || somente uma já sendo true ele não verificara o restante, logo o teste do if é true e entra no if e incrementa o z para 44. no System.out.println(z)// imprimira 44

Off course :oops:
Pode me chamar de burro :D

Até mais!

Raff
davidbuzatto:
Raff:
boolean x = true;
		boolean y = false;
		short z = 42;
		if((x == true)&&(y = true))z++;
		if((y == true)||(++z==44))z++;
		System.out.println(z);
na verdade não entra na segunda expressão do || o que acontece aqui é o seguinte.. vamos fazer rastreamento do codigo.. no primeiro if x é igual a true && y recebe true. logo entra em ação o primeiro if(ou seja o teste da verdadeiro)..incrementa o z para 43.. NO segundo if y é igual a true.. logo não executa a segunda expressão pois para o operador || somente uma já sendo true ele não verificara o restante, logo o teste do if é true e entra no if e incrementa o z para 44. no System.out.println(z)// imprimira 44

Off course :oops:
Pode me chamar de burro :D

Até mais!

burro nada cara essas coisas acontece mesmo !!

F

Tavo fazendo alguns simludados e cai o seguinte:

public class Varg_Args {
    
    public Varg_Args(String[]...array) { //1)
          System.out.println("Varg_Args String[]...array " +array[0]);
    }
    public Varg_Args(String...array) { //2)
          System.out.println("Varg_Args String...array " +array[0]);
    }
     public Varg_Args(String[] array) {//3)
         System.out.println("Varg_Args String...array " +array[0]);
    }
      public static void main(String...a){
         new Varg_Args(new String[]{"ola 1"});
         new Varg_Args("ola 2");
      }
}

qual linha deve ser removida para compilacao e execucao do codigo??

LPJava

na minha opniao a 3… pois ela e a 2 tem a mesma funcionalidade

a 1 nao!!

F

LPJava:
na minha opniao a 3… pois ela e a 2 tem a mesma funcionalidade

a 1 nao!!


Na mosca!! :slight_smile: eu tinha me espantado ao ver esse tipo de varg args,nunca tinha visto assim!!

anderson.bonavides

Para mim a 1 e a 3 tanto faz remover.

F
anderson.bonavides:
Para mim a 1 e a 3 tanto faz remover.
pois é cara eu tambem achavo mas o problema que String...a é diferente di String[]...a,acho que essa ultima seria como um vetor de vetores!ou seja cada posicao da a[0] vai referenciar outro vetor de strings,nao tenho certeza to tentando ir pela lógica :roll: mas como o LPJava falou a 2 e a 3 sao iguais. Agora tenho uma duvida alguem sabe pq isso aqui embaixo esta certo!?
public class Arrays {
    
    /** Creates a new instance of Arrays */
    public Arrays() {
    }
        public static void main(String...a){   
           int array[]={2,3,4,5,6,7};
           Object ob=new int[]{30,40,50,60,70,80,90};
         
//aqui estou criando o que????e pq nao da certo se fizer
//Object ob[]=new int[2];
//pois posso usar o polimorfismo assim
// Object ob=new Integer[2];
           array=(int[]) ob;
           System.out.println(array[0]);
    }
    
}

:shock:

Raff

pergunta dificil legal :slight_smile:

LPJava

fabioEM:
LPJava:
na minha opniao a 3… pois ela e a 2 tem a mesma funcionalidade

a 1 nao!!


Na mosca!! :slight_smile: eu tinha me espantado ao ver esse tipo de varg args,nunca tinha visto assim!!

eu tb… vi algumas perguntas dela no whizlabs e fui estudar… esse assunto está entre linhas do capitulo 3 do livro da kathy quando ela explica vargs!

fujioka

vai imprimir 30… array=(int[]) ob; pois o array ob é atribuido ao array de int , sendo que um cast é feito antes disso… =)… opa nem li…

Foi mau corrigindo não li direito… o enunciado…

por exemplo:

int y = 2;
String[] x = new String[2];
    x[0]=y; // isso não pode vc esta tentando adicionar um int num array de strings...

     Integer[] x = (Integer)new String[2]; // isso também não pode... vc esta fazendo o cast no array, mas e em seus membros?   

     Object ob = new int[2];  isso pode por que todo array é um Object
     Object[] ob = new int[2];  isso não pode um array de object não pode receber um array de ints
     Object[] ob = new Integer[3]; mas isto pode.. pois Integer é um Object passa no tes é um
            

            Integer vv = 4;
	if(vv instanceof Object){
		System.out.println("Integer passar no teste é um Object);
	}
F

Pois é fujioka mas o que aconteceu entao aqui embaixo?Eu criei um objeto?
ou uma variavel de referencia para ele?
Object ob = new int[2];
pois nao posso ver o conteudo,ou seja
System.out.println(ob[0]);!da erro de compilacao,como vc só sei que nao posso fazer isso, mas o pq? que nao posso visualizar:cry:
Realmente a dúvida esta mais se foi criado um object ou o que! :?

F

E olha so essa galera ,e coisa louca!! :shock:

Object ob=new int[10];
System.out.println(ob instanceof int[]);//beleza imprime true,apesar de nao saber que podia usar tipos primitivos como sendo vetores no instanceof!Fiquei sabendo agora as 12;41! :smiley:
então se a variável ob é uma instância do vetor int[] eu não deveria poder manipular-la?? :?Ou simplismente só deixei o compilador mais confuso que eu!!! :stuck_out_tongue:

LPJava

bom fabio vc confuiu… vc ai nao tem tipos primitivos vc tem um array que aceita elementos do tipo primitivo. Mas lembra que no fundo no fundo array sao sempre objetos? entao por isso que é valido o uso de instanceof para array… é comum sempre confudir o tipo dos elementos do array com a questao de tipos primitivos.

espero ter ajudado! capitulo 2 do livro da kathy se nao estou equivocado…

F

LPJava:
bom fabio vc confuiu… vc ai nao tem tipos primitivos vc tem um array que aceita elementos do tipo primitivo. Mas lembra que no fundo no fundo array sao sempre objetos? entao por isso que é valido o uso de instanceof para array… é comum sempre confudir o tipo dos elementos do array com a questao de tipos primitivos.

espero ter ajudado! capitulo 2 do livro da kathy se nao estou equivocado…

beleza cara isso eu sei , mas pq nao posso manipular??o objeto??
afinal ele passa no teste
ob=new int[20]; passa no texte (ob instanceof int[]) ,logo nao poderia
visualizar o conteudo ob[0] e pq nao posso fazer ob[]=new int[20]??
Essa é minha duvida maior cara! :roll:

LPJava

fabio vc está confudido as coisas como é q se criar um array normal? observe o seu codigo e veja o q está acontecendo…analise ele e veja exatamente o que acontece…
Lembre-se da regra também que toda class extends a Object em java… lembra dessa regra? todas… mais quero q vc analise o seu codigo com um codigo de array normal e veja qual a diferença entre ele e pq com o array normal vc consegue acessar o elemento e no seu exemplo vc nao consegue… assim eu poderia ti dar a resposta… mais . ti fiz essa pergunta para que entenda… e quando se deparar com qualquer outro tipo de questao venha saber o por que… e nao ficar limitado apenas ao recurso de array… tentar visualizar alem do obvio…

F

Ok, vamos então com a nossa velha revisão:
int array []=new int[20];criei um objeto array que referência um objeto vetor que tera espaço do tipo int para alocar ate 20-1 int;
Quando eu faço Object y=new int[20]; sei que aqui não estou criando um vetor do tipo Object mas uma referência para um vetor de tamanho 20 que fica no heap ,portanto ,de acordo acordo com esse raciocínio, só tenho uma referência para este objeto int mas se eu consegui criar uma referência de um objecto para um objeto int de vetor mas detalhe sabemos que nao se pode fazer
[/code]
int y=0;
(y instanceof Object)
[code]
mesmo pq que todas as classe extendam Justamente Object
ainda nao entendi porque não posso fazer Object og[]=new int[20]?
afinal cosegui ter uma referência para um vetor do tipo int!
valeu LPJava mas ainda não entendi cara...

J

Vc está declarando uma variável de referência do tipo Object ob, criando um array de int de tamanho 2 e fazendo com que a referência ob “aponte” para o array criado. Importante lembrar que todo array independente do tipo (inclusive os de primitivos) é um objeto.

ob é uma referência Object que pode “apontar” para objetos de qualquer classe, nem por isso ele tem todas as “funcionalidades” de todos os tipos de objetos, só as suas. Object não é um array, mas um array com certeza é um Object, pq array é um objeto e todo objeto excetuando-se Object é subclasse de Object.

FabioEM:
E olha so essa galera ,e coisa louca!! :shock:

Object ob=new int[10];
System.out.println(ob instanceof int[]);//beleza imprime true,apesar de nao saber que podia usar tipos primitivos como sendo vetores no instanceof!Fiquei sabendo agora as 12;41! :smiley:
então se a variável ob é uma instância do vetor int[] eu não deveria poder manipular-la?? :? Ou simplismente só deixei o compilador mais confuso que eu!!! :stuck_out_tongue:

A variável ob não é uma instância do vetor int[] ela “aponta” para um objeto do tipo [] int. A variável ob é do tipo Object e não tem as “funcionalidades” de um array de inteiros, mas o array por ser um Object tem todas as “funcionalidades” de Object, por exemplo: métodos wait(), notify(), equals(), hashCode(), …

Pq são tipos incompatíveis, int é um tipo primitivo não é um objeto. Não tem lógica verificar se um array int passa no teste é um para um array Object, apenas para Object. Experimente usar um array de Integer, verás que funciona. Um Integer é um Object.

F

Entao se pelo que entendi ao fazer

Integer y=0;
 if(y instanceof Integer){}

Neste nao estou dizendo: confira se y é uma instância da classe Integer,mas estou dizendo :confira se y é um tipo de Integer?Mas nao é a mesma coisa?
pq achavo que instanceof significa instância
mas valeu o resto sua explicação entendi :smiley:

J

A palavra instanceof traduzindo ao pé da letra seria algo como “instância de”, o significado aqui é "Verifique se y “aponta” para um objeto que passa no teste é um para a classe Integer."
Se fosse uma coisa desse tipo:

vc poderia fazer a tradução ao pé da letra: “Verifique se esse objeto é uma instância de Integer”.

Lembrando que instanceof só funciona para variáveis ou objetos que estejam na mesma hierarquia da classe a ser testada.

Criado 6 de fevereiro de 2008
Ultima resposta 8 de fev. de 2008
Respostas 36
Participantes 14