2013-09-27 5 views
11

Sto provando a eseguire un confronto di numeri bitwise e il mio codice continua a generare un inizio di espressione non valido sulla riga 30 del mio codice con l'istruzione "if".Inizio illegale dell'espressione Java Boolean?

Il mio codice recita così:

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

+16

Perché la gente votando la domanda verso il basso? Afferma il problema con la massima chiarezza del richiedente e dimostra lo sforzo. Non tutte le domande devono riguardare argomenti avanzati o target coder avanzati. – shovavnik

+0

Vuoi dire, la terza affermazione se? – Raedwald

risposta

104

Un if affermazione è della forma:

if (condition) statement 

Hai attualmente got due condizioni tra parentesi ... che finiscono anche fino assegnare i valori, che probabilmente non è quello che desideri.

Quindi primo fix per farlo compilare:

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

quindi modificare le assegnazioni ai controlli di uguaglianza, in quanto altrimenti sarà sufficiente assegnare true per entrambe le variabili e la condizione passerà indipendentemente dai loro valori precedenti:

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

Quindi rimuovere i confronti con costanti booleane:

if ((First_Relation) & (Second_Relation)) 

quindi rimuovere parentesi inutili:

if (First_Relation & Second_Relation) 

quindi apportare le variabili seguono Java convenzioni di denominazione:

if (firstRelation & secondRelation) 

quindi utilizzare il più convenzionale && invece di &-&& è breve circuito, ed è quasi sempre quello che vuoi:

Ora hai ancora un punto e virgola immediatamente dopo la tua condizione if, che lo rende inutile: sarà sempre eseguire l'istruzione System.out.println, perché non fa parte dell'istruzione if. Si potrebbe è sufficiente rimuovere il punto e virgola, ma mi piacerebbe aggiungere le parentesi graffe per chiarezza:

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

Avanti, notare che si sta solo in realtà inizializza le variabili, se la condizione è vera - così avrai attualmente ottenere un errore in fase di compilazione per cercare di leggere variabili che non sono assegnate in modo definitivo.

In primo luogo, fissare l'assegnazione definitiva:

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

... e il codice di cui sopra dovrebbe andare bene.

Successivamente, si nota che stai davvero guadagnando davvero poco da quelle variabili extra.Inline le condizioni invece:

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

A questo punto, diventa molto chiaro che c'è un ulteriore bug - perché il vostro messaggio parla !(r < s) ma la condizione è solo r < s. Quindi devi decidere cosa vuoi ottenere e fare in modo che il codice e il messaggio riflettano la stessa cosa. Si noti che non si finisce il messaggio, neanche. In effetti, si potrebbe semplificare il tutto a:

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

... o quello che volete l'espressione di essere in realtà.

+0

+1 per la digitazione (molto) più veloce di me – ivarni

+0

Bella risposta! Intendo anche entrambe le espressioni di relazione, in quanto migliorano la leggibilità: if (P> Q && R isnot2bad

+1

@ isnot2bad: Vero, lo dirò. –

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

e il modo efficace è

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

Il primo snippet non verrà compilato e non hai ancora spiegato le differenze. –

+0

considera la mia risposta aggiornata – Ashok

+0

Bene che ora compila, ma non hai spiegato nulla sul perché hai cambiato '&' in '&&' o '=' in '=='. –

1

cercare di prendere

(First_Relation = true) & (Second_Relation = true) 

tra parentesi. E rimuovere ";" dalla fine dell'istruzione "se", perché non ha senso: ";" è considerato come una nuova terminazione dell'istruzione (dichiarazione vuota nel tuo caso) e come tu non hai fornito l'ambito per l'istruzione "if" - funziona solo per il prossimo statemnt, vale a dire dichiarazione vuota.

4

Per quanto ne so, non è possibile utilizzare l'operatore & in Java per eseguire un bit a bit confronto tra doppie. Può essere usato solo con altri primitivi più semplici, come ints e chars.

Inoltre, il modo in cui si sta utilizzando l'operatore & non eseguire un confronto bit per bit tra i numeri perché lo si usa per confrontare i risultati di P>Q e R<S, entrambi i quali producono valori booleani.

Per eseguire un confronto bit a bit tra i doppi, è necessario utilizzare una tecnica diversa per confrontare direttamente P con Q e R con S. Ecco un esempio di un modo per farlo: https://stackoverflow.com/a/13928322/213343.

+0

Dove sta cercando di eseguire il confronto bit a bit tra i doppi? – matehat

+0

Non nel codice.La sua domanda inizia con: "Sto cercando di eseguire un confronto di numeri bitwise ...". La mia risposta spiega perché il suo codice non raggiunge questo obiettivo. Inoltre, si adatta all'utilizzo errato dell'operatore &, che * è * l'operatore AND bit a bit. – shovavnik

1

Se la condizione non viene soddisfatta, non viene visualizzato alcun messaggio. Suggerisco pertanto di:

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