2013-03-14 15 views
8
private String getWhoozitYs(){ 
    StringBuffer sb = new StringBuffer(); 
    boolean stop = generator.nextBoolean(); 
    if(stop = true) 
    { 
     sb.append("y"); 
     getWhoozitYs(); 
    } 
    return sb.toString(); 
} 

To jest fragment kodu dla projektu, który robię w kursie programowania. Problem, który mam, polega na tym, że po zadeklarowaniu Boolean Stop i próbie przypisania mu losowo wygenerowanej wartości Boolean, nie mogę użyć go w instrukcji if, aby określić, czy powinienem dodać więcej y do StringBuffer, czy nie. Mam generator losowy wewnątrz konstruktora, więc ta część nie stanowi problemu. Zakładałem, że skoro deklarowałem wartość boolean poza instrukcją if, mógłbym użyć jej wewnątrz, ale nie wydaje się, żeby tak było. Prawdziwe pytanie brzmi: jak mogę użyć losowo określonej wartości boolowskiej w instrukcji if.Jak używać tej wartości logicznej w instrukcji if?

+0

Hej myślę możesz to rozgryźć, jest to fajna zagadka ... sprawdź rzucanie. esp. 0 i 1 – Coffee

+1

Możesz też po prostu powiedzieć: 'if (stop)' Zobacz to - http://stackoverflow.com/questions/3793650/convert-boolean-to-int-in-java – Coffee

Odpowiedz

19

if(stop = true) powinno być if(stop == true), lub po prostu (lepiej!) if(stop).

Właściwie jest to dobra okazja, aby zobaczyć powód dlaczego zawsze używać if(something) jeśli chcesz zobaczyć, czy to true zamiast pisać if(something == true) (złego stylu!).

Wykonując stop = true, przypisujesz true do stop i nie można tego porównać.

Dlaczego więc kod poniżej instrukcji if został wykonany?

Zobacz JLS - 15.26. Assignment Operators:

W czasie wykonywania wynikiem wyrażenia przypisania jest wartość zmienna po nastąpieniu cesji. Wynik wyrażenia przypisania przypisania nie jest zmienną.

Tak więc, ponieważ napisałeś stop = true, spełniasz warunek if.

+4

Właściwie powinno to być po prostu '. if (stop) '. To nie jest nawet otwarte na błędną interpretację z powodu literówek. : P – cHao

+0

Jeśli nadal się porównujemy, to od momentu, gdy stop zostanie ustawiony na true, zawsze będzie to prawda. przepraszam, to jest dzioba, ale wydaje się, że warto coś wyjaśnić (ponieważ OP jest początkującym). –

+0

Jedna wątpliwość ... 'if (stop)' i 'if (stop == true)' czy druga potrzeba dodatkowych cykli procesora do wykonania. Programatycznie zarówno interprete sam, to dlaczego jest zły w użyciu? – kAmol

1

Od stop jest logiczna można zmienić tę część do:

//... 
if(stop) // Or to: if (stop == true) 
{ 
    sb.append("y"); 
    getWhoozitYs(); 
} 
return sb.toString(); 
//... 
1
if(stop == true) 

lub

if(stop) 

= służy do przeniesienia.

== służy do sprawdzania stanu.

if(stop = true) 

Przypisuje wartość true, aby zatrzymać i ocenia, czy (prawda). Więc zawsze będzie wykonywał kod wewnątrz, jeśli ponieważ stop zawsze będzie przypisany z wartością true.

1

Spróbuj tego: -

private String getWhoozitYs(){ 
    StringBuffer sb = new StringBuffer(); 
    boolean stop = generator.nextBoolean(); 
    if(stop) 
    { 
     sb.append("y"); 
     getWhoozitYs(); 
    } 
    return sb.toString(); 
} 
1

= dla przypisania

zapisu

if(stop){ 
    //your code 
} 

lub

if(stop == true){ 
    //your code 
} 
1

dodatkowo można po prostu napisać

if(stop) 
{ 
     sb.append("y"); 
     getWhoozitYs(); 
} 
3

Właściwie cała podejście byłoby czystsze, gdybyś miał tylko użyć jednej instancji StringBuffer, zamiast tworzyć jedną w każdym wywołaniu rekurencyjnym ... pójdę do:

private String getWhoozitYs(){ 
    StringBuffer sb = new StringBuffer(); 
    while (generator.nextBoolean()) { 
     sb.append("y"); 
    } 

    return sb.toString(); 
}