2013-09-27 36 views
11

Próbuję uruchomić porównanie liczb bitowych i mój kod ciągle wymyśla nielegalne rozpoczęcie wyrażenia na linii 30 mojego kodu za pomocą instrukcji "if".Nielegalne uruchamianie wyrażeń Java Boolean?

Mój kod brzmi tak:

public class Project7 { 

    public static void main(String[] args) { 
     Scanner keyboard = new Scanner(System.in); 
     double P = keyboard.nextDouble(); 
     double Q = keyboard.nextDouble(); 
     double R = keyboard.nextDouble(); 
     double S = keyboard.nextDouble(); 
     boolean First_Relation; 
     boolean Second_Relation; 

     if (P > Q) First_Relation = true; 
     if (R < S) Second_Relation = true; 

     if (First_Relation = true) & (Second_Relation = true); 
     System.out.println("Given the values for p,q,r, and s the expression " 
     + "(p > q) && !(r < s) evaluates to "); 
    } 
} 
+0

'First_Relation = TRUE powinno być' First_Relation == TRUE w 'if' – Ashok

+16

Dlaczego ludzie głosując na pytanie w dół? Stanowi to tak jasno, jak pytający jest w stanie, i demonstruje wysiłek. Nie każde pytanie musi dotyczyć zaawansowanych tematów lub docelowych zaawansowanych programistów. – shovavnik

+0

Masz na myśli trzecią instrukcję if? – Raedwald

Odpowiedz

104

if oświadczenie ma postać:

if (condition) statement 

pan obecnie dostał dwa nawiasach warunki ... co też skończyć przypisywanie wartości, co prawdopodobnie nie jest tym, czego potrzebujesz.

Więc najpierw naprawić aby zmusić go do kompilacji:

if ((First_Relation = true) & (Second_Relation = true)) 

Następnie zmień przypisania do kontroli równości, ponieważ w przeciwnym razie będzie to po prostu przypisać true do obu zmiennych i stan minie, niezależnie od ich wcześniejszych wartości:

if ((First_Relation == true) & (Second_Relation == true)) 

Następnie wyjąć porównań ze stałych logicznych:

if ((First_Relation) & (Second_Relation)) 

następnie usunąć niepotrzebne nawiasy:

if (First_Relation & Second_Relation) 

następnie dokonać zmienne podążać Java konwencje nazewnictwa:

if (firstRelation & secondRelation) 

Następnie użyj bardziej konwencjonalny && zamiast & - && zwarcie i jest prawie zawsze co chcesz:

if (firstRelation && secondRelation) 

Teraz masz jeszcze półkolumny reż ectly after your if warunek, który czyni go bezcelowym - będzie zawsze wykonać instrukcję System.out.println, ponieważ nie jest to częścią instrukcji if. Ci mógłby prostu usunąć średnik, ale chciałbym dodać szelki dla jasności:

if (firstRelation && secondRelation) { 
    System.out.println("insert text here"); 
} 

Następny pamiętać, że jesteś tylko faktycznie inicjalizacji zmiennych, jeśli warunek jest prawdą - tak będziesz aktualnie uzyskać błąd podczas kompilacji, aby spróbować odczytać zmienne, które nie są definitywnie przypisane.

pierwsze, ustalić ostateczną Zadanie:

// Names changed to follow conventions 
boolean firstRelation = p > q; 
boolean secondRelation = r < s; 

... a kod powyżej powinny być w porządku.

Następnie, miejsce, które naprawdę zyskujesz bardzo niewiele dzięki tym dodatkowym zmiennym.Inline warunki zamiast:

if (p > q && r < s) { 
    System.out.println("Given the values for p,q,r, and s the expression " 
    + "(p > q) && !(r < s) evaluates to "; 
} 

W tym momencie staje się jasne, że istnieje bug dalej - ponieważ przekaz mówi o !(r < s) ale warunek jest tylko r < s. Musisz więc zdecydować, co chcesz osiągnąć i sprawić, by kod i wiadomość odzwierciedlały to samo. Pamiętaj, że nie kończysz też wiadomości. Rzeczywiście, można uprościć całość, aby:

System.out.println("Given the values for p,q,r, and s the expression " 
    + "(p > q) && !(r < s) evaluates to " + ((p > q) && !(r < s)); 

... lub cokolwiek chcesz, aby wyrażenie faktycznie było.

+0

+1 za pisanie (dużo) szybciej ode mnie – ivarni

+0

Dobra odpowiedź! Wstawiłbym także oba wyrażenia relacji, ponieważ zwiększają one czytelność: jeśli (P> Q && R isnot2bad

+1

@ isnot2bad: True, wspomnę o tym. –

2
if (First_Relation == true && Second_Relation == true) 
{ 
    System.out.println("Given the values for p,q,r, and s the expression " 
    + "(p > q) && !(r < s) evaluates to "); 
} 

i skutecznym sposobem jest

if (First_Relation && Second_Relation) 
    { 
     System.out.println("Given the values for p,q,r, and s the expression " 
     + "(p > q) && !(r < s) evaluates to "); 
    } 
+0

Pierwszy fragment nadal się nie kompiluje, a tak naprawdę nie wyjaśniłeś różnic. –

+0

rozważ moją zaktualizowaną odpowiedź – Ashok

+0

Cóż, teraz kompiluje, ale nie wyjaśniłeś nic, dlaczego zmieniłeś '&' na '&&' lub '=' na '=='. –

1

starać

(First_Relation = true) & (Second_Relation = true) 

w nawiasach. I usuń ";" od końca instrukcji "if", ponieważ nie ma sensu: ";" jest uważane za nowe wypowiedzenie oświadczenia (puste oświadczenie w twoim przypadku) i jako że nie podano zakresu instrukcji "if" - działa tylko dla następnego statemnt, tj. pustego wyciągu.

4

O ile mi wiadomo, nie można użyć operatora & w Javie wykonać bitowe porównanie między deblu. Można go używać tylko z innymi prostymi prymitywami, takimi jak int i chars.

Ponadto sposób używasz operatora & nie wykona porównanie bitowe pomiędzy numerami, ponieważ używasz go porównać wyniki i R<SP>Q, z których oba wytworzenia wartości logicznych.

Aby wykonać bitowe porównanie między sobowtórami, musisz użyć innej techniki, aby bezpośrednio porównać P z Q i R z S. Oto przykład jednego z tych sposobów: https://stackoverflow.com/a/13928322/213343.

+0

Gdzie on próbuje dokonać bitowego porównania między dublami? – matehat

+0

Nie w kodzie.Jego pytanie zaczyna się od: "Próbuję uruchomić porównanie liczby bitowej ...". Moja odpowiedź wyjaśnia, dlaczego jego kod nie osiąga tego celu. Dodatkowo pasuje to do nieprawidłowego użycia operatora &, który * jest * bitowym operatorem AND. – shovavnik

1

Jeśli warunek nie zostanie spełniony, wówczas nie ma komunikatu. Proponuję zatem:

boolean evaluation = (P > Q) && !(R < S); 
System.out.println("Given the values for p,q,r, and s the expression " 
    + "(p > q) && !(r < s) evaluates to " + evaluation);