2013-09-27 10 views
11

Ich versuche, einen Bitwise-Zahlenvergleich durchzuführen, und mein Code kommt mit einem ungültigen Ausdrucksstart in Zeile 30 meines Codes mit der "if" -Anweisung auf.Ungültiger Ausdrucksbeginn Java Boolean?

Mein Code lautet wie folgt:

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' sollte' First_Relation == true' in 'if' – Ashok

+16

Warum unten Menschen Abstimmung über die Frage werden? Es stellt das Problem so klar dar, wie es der Fragesteller kann, und demonstriert die Anstrengung. Nicht jede Frage muss über fortgeschrittene Themen oder fortgeschrittene Programmierer sein. – shovavnik

+0

Sie meinen, die dritte if-Anweisung? – Raedwald

Antwort

104

Eine if Aussage ist von der Form:

if (condition) statement 

Sie sind zur Zeit zwei klammert Bedingungen haben ... die auch am Ende Zuweisen von Werten, was wahrscheinlich nicht das ist, was Sie wollen.

So first fix, um es zu kompilieren:

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

dann die Zuweisungen auf Gleichheit prüft ändern, da sonst wird es einfach true beide Variablen zuweisen und die Bedingung wird ohne Rücksicht auf ihre vorherigen Werte:

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

Dann entfernen Vergleiche mit boolean Konstanten:

if ((First_Relation) & (Second_Relation)) 

Dann unnötige Klammern entfernen:

if (First_Relation & Second_Relation) 

Dann machen die Variablen Java Namenskonventionen folgen:

if (firstRelation & secondRelation) 

Dann nutzen Sie die konventionelleren && statt &-&& ist von Kurzschlüssen, und ist fast immer Was Sie wollen:

if (firstRelation && secondRelation) 

Jetzt haben Sie noch ein Semikolon dir ectly nach Ihrer if Bedingung, die es sinnlos macht - es wird immer führen Sie die System.out.println Anweisung, denn das ist nicht Teil der if Aussage. Sie könnte entfernen Sie einfach das Semikolon, aber ich würde hinzufügen, Klammern für Klarheit:

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

Als nächstes beachten Sie, dass Sie nur die Variablen tatsächlich initialisiert, wenn die Bedingung erfüllt ist - so dass Sie zur Zeit Erhalte einen Fehler beim Kompilieren, um zu versuchen, Variablen zu lesen, die nicht definitiv zugewiesen sind.

Zuerst befestigen Sie die eindeutige Zuordnung:

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

... und der obige Code sollte in Ordnung sein.

Als nächstes stellen Sie fest, dass Sie tatsächlich sehr wenig von diesen zusätzlichen Variablen gewinnen.Inline-Bedingungen statt:

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 "; 
} 

An diesem Punkt wird es sehr klar, dass es ein weiterer Fehler ist - weil Sie Ihre Nachricht über !(r < s) spricht aber die Bedingung ist nur r < s. Sie müssen also entscheiden, was Sie erreichen möchten, und der Code und die Nachricht sollen dasselbe widerspiegeln. Beachten Sie, dass Sie die Nachricht auch nicht beenden. In der Tat könnten Sie die ganze Sache zu vereinfachen:

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

... oder was auch immer Sie wollen, dass der Ausdruck tatsächlich sein.

+0

+1 für die Eingabe (viel) schneller als ich – ivarni

+0

Schöne Antwort! Ich würde auch beide Relation Ausdrücke inline, wie sie Lesbarkeit verbessern: wenn (P> Q && R isnot2bad

+1

@ isnot2bad: True, wird das erwähnen. –

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 "); 
} 

und der effektivste Weg ist,

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

Das erste Snippet wird immer noch nicht kompiliert, und Sie haben die Unterschiede nicht wirklich erklärt. –

+0

betrachte meine aktualisierte Antwort – Ashok

+0

Nun, das kompiliert jetzt, aber du hast nichts darüber erklärt, warum du '&' in '&&' oder '=' in '==' geändert hast. –

1

Try

(First_Relation = true) & (Second_Relation = true) 

in Klammern zu nehmen. Und entfernen Sie das ";" vom Ende der "wenn" -Aussage, weil es keinen Sinn ergibt: ";" wird als eine neue Anweisungsbeendigung betrachtet (in Ihrem Fall eine leere Anweisung), und da Sie den Gültigkeitsbereich für "if" -Anweisung nicht angegeben haben, funktioniert sie nur für die nächste Anweisung, d. h. leere Anweisung.

4

Soweit ich weiß, können Sie den & Operator in Java nicht verwenden, um eine bitweise Vergleich zwischen Doppel auszuführen. Es kann nur mit anderen einfacheren Primitiven wie Ints und Chars verwendet werden.

Darüber hinaus ist die Art und Weise Sie die & Operator sind nicht eine bitweise Vergleich zwischen den Zahlen durchführen, weil Sie es verwenden, die Ergebnisse von P>Q und R<S, von denen beide Boolesche Werte erzeugen zu vergleichen.

Um einen bitweisen Vergleich zwischen Doppelpunkten durchzuführen, müssen Sie eine andere Technik verwenden, um P direkt mit Q und R mit S zu vergleichen. Hier ein Beispiel für eine Möglichkeit: https://stackoverflow.com/a/13928322/213343.

+0

Wo versucht er, einen bitweisen Vergleich zwischen Doubles durchzuführen? – matehat

+0

Nicht im Code.Seine Frage beginnt mit: "Ich versuche einen bitweisen Zahlenvergleich durchzuführen ...". Meine Antwort erklärt, warum sein Code dieses Ziel nicht erreicht. Dies passt auch zur falschen Verwendung des Operators &, der * der bitweise UND-Operator ist. – shovavnik

1

Wenn die Bedingung nicht erfüllt ist, gibt es keine Nachricht. Ich schlage daher vor:

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);