Apanhando de operadores basicos

10 respostas
B

Ola pessoal,
ha algum tempo nao vinha aqui. Vejo que o forum continua a mil, e isso eh otimo. :slight_smile:

Ontem, enquanto revia algumas questoes basicas para SCJP, percebi que ainda apanho do operador “perguntinha”.
Queiram por gentileza ver do que estou falando:

public class MyDoubt {
  public static void main (String[] args) {
    boolean b = false;
    String s = (b=!b) ? (b=!b) ? "Hello" : "hello" : (b=!b) ? "world" : "World";
    System.out.println(s);
  {
}

Perdido em minha infinita ignorancia, estava crente que o codigo acima iria imprimir “Hello” (com maiuscula).
O resultado todavia eh “hello” (com minuscula).

Alguma boa alma poderia esclarecer isso pra mim.
Grato.

10 Respostas

wbdsjunior
Barbado:
Ola pessoal, ha algum tempo nao vinha aqui. Vejo que o forum continua a mil, e isso eh otimo. :)

Ontem, enquanto revia algumas questoes basicas para SCJP, percebi que ainda apanho do operador "perguntinha".
Queiram por gentileza ver do que estou falando:

public class MyDoubt {
  public static void main (String[] args) {
    boolean b = false;
    String s = (b=!b) ? (b=!b) ? "Hello" : "hello" : (b=!b) ? "world" : "World";
    System.out.println(s);
  }
}

Perdido em minha infinita ignorancia, estava crente que o codigo acima iria imprimir "Hello" (com maiuscula).
O resultado todavia eh "hello" (com minuscula).

Alguma boa alma poderia esclarecer isso pra mim.
Grato.

tente ver da seguinte forma:
boolean b = false;
String s;

if (b = !b) { // atribui !b (b é false... logo !b é true) a b e verifica. é verdadeiro.
    if (b = !b) { // então atribui !b (b agora é true... logo !b é false) a b e verifica. é falso;
        s = "Hello";
    } else {
        s = "hello"; // então atribui "hello" a s;
    }
} else {
    if (b = !b) {
        s = "world";
    } else {
        s = "World";
    }
}

System.out.println(s);

abraço.

Renyo

b = false;

if (b == (!b))

out.print(Hello)

else

out.print(hello)

simpres :smiley:

B

wbdsjunior e Renyo

Obrigado, intindi. :slight_smile:

Lavieri

e deve ver outra coisa tb… nunca escreva isso em sua vida de programador…

e quando tiver que ver um código… e achar algo do tipo… XINGUE muito a pessoa que fez isso… e altere o código log que puder…

código é pra ser lido facilmente, e não pra ter q decifrar o que o cara escreveu…

B

Lavieri,
peguei esse codigo de uma apostila da Globalcode.

Acho que o Vinicius Senger entende “um pouquinhozinho” da coisa, nao?

T
String s = (b=!b) ? (b=!b) ? "Hello" : "hello" : (b=!b) ? "world" : "World";

O problema do operador “?” é que a associatividade dele é estranhíssima - é à direita, portanto é equivalente a:

(b=!b) ? 
      (b=!b) ? "Hello" : "hello" 
    : (b=!b) ? "world" : "World";

Na prática, como a associatividade dele não é intuitiva, se usarmos tal monstruosidade (é claro que o Vinicius não iria usar um código desse em produção. É coisa que os professores ensinam porque é para não usar), devemos pôr alguns parênteses, e quebrar em linhas.
Eu faria assim:

(b = !b) ? 
      ( (b=!b) ? 
            "Hello" 
          : "hello" )
    : ( (b=!b) ? 
            "world" 
          : "World" );
Renyo

Lavieri:
e deve ver outra coisa tb… nunca escreva isso em sua vida de programador…

e quando tiver que ver um código… e achar algo do tipo… XINGUE muito a pessoa que fez isso… e altere o código log que puder…

código é pra ser lido facilmente, e não pra ter q decifrar o que o cara escreveu…

AHHHHHHHHH

xingue muito a pessoa…eu ri disso askljdlsakdjsa

Lavieri
Barbado:
Lavieri, peguei esse codigo de uma apostila da Globalcode.

Acho que o Vinicius Senger entende "um pouquinhozinho" da coisa, nao?

é que isto é um exercicio, ou seja, é algo realmente pra vc quebrar a cabeça, é algo pra vc ficar ali olhando e com certeza vc não simplismente bate o olho e da a resposta...

como exercicio é valido, para aguçar a logica, e verificar o entendimento, porem para programar coisas desse tipo devem ser evitadas, em favor de uma programação legível

public class NewClass {
    public static void main(String ... args) {
        imprimeMenorValor(3,6,2);
    }

    public static void imprimeMenorValor(int yhjs,int zkjs,int zlça) {
       System.out.println((zkjs > zlça) ? (yhjs< zlça) ? yhjs : zlça : (yhjs < zkjs) ? yhjs : zkjs);
    }
}

apesar disto ser 1 solução, e de produzir o resultado esperado, em termos de programação, esse código esta 1 porcaria.... o.O

.......

foi nestes termos que comentei, sobre xingar o elemento que fizer um código dakele ^^ .... vale como exercicio, mas na pratica, usar varios ternarios juntos é suicidio, principalmente para menter o código
.......

EDIT.: agora imagina esse código ai, no meio de um monte de códigos e imagina mais, se o nome do método tb não foi legivel ?? se tu trocar o nome daquele método para

public static void imprime(int yhjs,int zkjs,int zlça)

e agora ?? depois de um tempo, se tu olhar pra quele código ?? quanto tempo c acha que vc leva pra descobrir o que ele faz ?? qual o proposito dele ??

B

Lavieri:
e deve ver outra coisa tb… nunca escreva isso em sua vida de programador…

e quando tiver que ver um código… e achar algo do tipo… XINGUE muito a pessoa que fez isso… e altere o código log que puder…

código é pra ser lido facilmente, e não pra ter q decifrar o que o cara escreveu…

Por isso que falo que programar da maneira como cai na SCJP, é motivo pra demissão. A parte que não cai a API tem zero % de relação com a realidade.

victorwss

Bruno Laturner:
Lavieri:
e deve ver outra coisa tb… nunca escreva isso em sua vida de programador…

e quando tiver que ver um código… e achar algo do tipo… XINGUE muito a pessoa que fez isso… e altere o código log que puder…

código é pra ser lido facilmente, e não pra ter q decifrar o que o cara escreveu…

Por isso que falo que programar da maneira como cai na SCJP, é motivo pra demissão. A parte que não cai a API tem zero % de relação com a realidade.

Acho que logo no primeiro capítulo do livro da Kathy Sierra está escrito que os códigos da prova de certificação tem o objetivo de serem confusos para testar se você consegue entender, e nunca serem utilizados em programas reais.

Criado 5 de março de 2009
Ultima resposta 5 de mar. de 2009
Respostas 10
Participantes 7