2013-05-16 6 views
6

Perché java richiede un doppio segno di uguale (==) quando si confrontano i numeri interi in una dichiarazione if?Perché java richiede un doppio segno di uguale?

Per esempio

if(x = 3.141) 
    System.out.println("x is equal to pi."); 

non è corretto, dovrebbe essere

if(x == 3.141) 
    System.out.println("x is equal to pi."); 

so che "==" viene utilizzato per confrontare gli interi e "=" viene utilizzato per impostare un valore intero, ma perché in una dichiarazione if rimane vero?

È anche consentito assegnare una variabile a un valore in un se l'istruzione (o avviare una nuova variabile)?

C'è qualche motivo per cui qualcuno vorrebbe mai assegnare una variabile a un nuovo valore all'interno di una dichiarazione if (se così si prega di fornire un esempio)?

Questa sembra una domanda che dovrebbe già avere una risposta, ma non sono riuscito a trovarne una qui o usando google, se questa è una domanda doppia, mi dica e la rimuoverò immediatamente.

risposta

9

Non sarebbe confuso se a = a volte l'assegnazione e talvolta il confronto, a seconda del contesto in cui l'hai utilizzata?

Sembra una cattiva idea e introduce errori.

Inoltre, la sintassi corrente è compatibile con C e C++, quindi molte persone hanno familiarità con esso.

C'è qualche ragione per cui qualcuno vorrebbe mai definire una variabile un nuovo valore all'interno di un'istruzione if (se sì, si prega di fornire un esempio)?

E 'abbastanza comune in while loop:

int b; 
while ((b=in.read()) != -1){ 
+0

Puoi int. una variabile in una dichiarazione if? – java

+1

Fun fact: sovraccarico VB (e VB.NET) '=' per entrambe le assegnazioni e l'uguaglianza. [VB] 'a = b = c' == [Java]' a = b == c; '(non [Java]' a = b = c; '). – michaelb958

+0

@ michaelb958: Ma non hanno affatto "==" allora, giusto? Anche questo è coerente. – Thilo

1

Nota quello messaggio di errore che si ottiene per if (x = 3.141); è un errore di tipo (impossibile convertire da double a boolean).

Il tipo di assegnazione è il tipo di entrambi i lati; se il tipo di assegnazione è booleano (if (x = true) o anche if (x = a.equals(b))), è legale scrivere.

Pertanto, poiché è legale assegnare un valore a boolean nella condizione, è necessario utilizzare == per il confronto.

+0

'Se il tipo di assegnazione è booleano (if (x = true)), allora è legale scrivere. Anche se è corretto, è molto probabile che si tratti di un errore. Perché uno vorrebbe assegnare, quindi testare subito? – nhahtdh

+1

@nhahtdh ha cambiato il mio esempio. Sono d'accordo che è cattivo stile, però. –

1

E 'anche consentito assimulare una variabile un valore in un'istruzione if (o avviare una nuova variabile)?

Sì. Un idioma comune per farlo è:

String line = null; 
while ((line = in.readLine()) != null) { 
    // do work 
} 

Nel loop, alla linea viene assegnato un valore e quindi confrontato con null. Non riesco a pensare ad un esempio con gli interi; certamente non sarebbe chiaro lì.

+0

e in una dichiarazione if? Non posso impostare e variabile = a un altro o int. una variabile senza ottenere così tipo di errore – java

+0

@java: non basta semplicemente impostare la variabile. Se si desidera impostare un gruppo di variabili, è possibile farlo prima del ciclo. A meno che tu non possa incorporare il compito in un confronto, come nell'esempio, allora non sarai in grado di fare assegnamento nella condizione di tempo. Detto questo, non forzarti a scrivere una cosa del genere se è innaturale e confusa. – nhahtdh

+1

Quindi vuoi '=' comportarsi diversamente non solo in condizionali e dichiarazioni, ma anche in modo diverso per condizioni di 'while' e' if'? – Thilo

0

è possibile assegnare una variabile in un'istruzione if in modo assoluto. inoltre, questo è solo il modo in cui funziona: = è sempre un compito e == è sempre un confronto.

1
= 

viene utilizzato per l'assegnazione.

== 

viene utilizzato per il confronto.

È anche consentito assegnare una variabile a un valore in un'istruzione if (o avviare una nuova variabile)?

sì, è consentito.

+0

Inizializza nuova variabile non consentita, IIRC. Ciò è consentito solo in 'for' – nhahtdh

+0

@nhahtdh L'inizializzazione non è consentita. L'assegnazione è. – EyadMhanna

1

storia dei linguaggi di programmazione 101:

  • Fortran utilizza = per entrambi.
  • Algol ha introdotto := per l'assegnazione e utilizzato = per il confronto. Questo era necessario per risolvere un'ambiguità grammaticale.
  • Pascal ha seguito l'esempio.
  • PL/1 no.
  • non posso parlare per la B o BCPL ma per il momento abbiamo ottenuto C era = per l'assegnazione e == di confronto, di nuovo per risolvere un'ambiguità di grammatica
  • C++ seguita C
  • Java seguita C++ per molti aspetti incluso questo.

L'ambiguità grammaticale deriva dall'assegnazione di assegnazioni nelle espressioni. Contrariamente a quanto asserito, if (x = true) è legale in Java se x è di tipo booleano.

1

== è il comparatore di identità, che funziona sia per gli oggetti che per i primitivi. Risponde alla domanda "sono le due cose la stessa cosa".

= è l'operatore di assegnazione. Imposta il valore del lato sinistro sul lato destro.

Le cose possono trasformare buggy quando si utilizza il tuo esempio con booleani:

boolean b; 

if (b = true) // This compiles, but is a bug, because it sets b, not tests it 

Mentre altri tipi non compilare con questa sintassi, boolean e Boolean fare, così è per questo che si consiglia il seguente schema:

if (b) 
0

Quindi ..

= è l'assegnazione, e == è il confronto, ed è alw ays come questo, non importa dove vengono utilizzati.

E l'assegnazione è diversa con "dichiarazione". Una dichiarazione di assegnazione ha il suo valore di ritorno, mentre una dichiarazione no.Pertanto non è possibile scrivere boolean a = false nell'istruzione () dell'istruzione if, ma è possibile scrivere a = false quando è stato dichiarato in precedenza.

Non tutte le assegnazioni sono legali. Per esempio:

int index; 
if (index = str.indexOf("something")) { 
    ... 
} 

Non è legale, perché String.indexOf(String) restituisce un int, mentre if richiede un valore booleano.

Inoltre, v'è una differenza enorme tra "legale" e"dare un senso".

int index; 
if ((index = str.indexOf("something")) != -1) { 
    ... 
} 

E 'legale, come != operazione restituisce un valore booleano, e ha senso, come io voglio verificare se la str contiene una stringa "qualcosa";

Tuttavia,

int index; 
boolean flag; 
if (flag = ((index = str.indexOf("something")) != -1)) { 
    ... 
} 

è anche legale, come l'istruzione come ultimo ritorna un valore booleano; ma NON ha senso, perché la dichiarazione != restituisce già un valore booleano.

+0

Il motivo per cui non è possibile utilizzare una dichiarazione in una condizione è perché la sintassi non lo consente, non perché "una dichiarazione non ha un valore restituito". – EJP

Problemi correlati