2015-04-02 15 views
6

Sto provando a valutare l'espressione (1 <= month <= 12) in una condizione if.Valutazione dell'espressione 1 <= mese <= 12

Questa dichiarazione sembra valida in javascript, ma non in Java.

In Java,

int month = 0; 
boolean flag = (1 <= month <= 12); 

getta l'errore seguente:

The operator <= is undefined for the argument type(s) boolean, int

in JavaScript,

var month = 0; 
console.log('Expression evaluates to: ', (1 <= month <= 12)); 

It always returns true no matter what the value of month is.

Qualcuno può spiegare:

  • Se è un'espressione valida o no?
  • Perché sempre cede a true in javascript?
  • Perché java lo considera un'espressione non valida?

Inoltre so che posso farlo funzionare in questo modo (1 <= month && month <= 12). Quindi, non cercando una soluzione ma una spiegazione.

Grazie. Fammi sapere anche se le mie domande non sono chiare.

+0

Questa è un'espressione valida (in JavaScript, non in Java), ma non esegue ciò che si pensa che faccia. Java non ti consente di eseguire un confronto come quello tra un numero e un booleano, ma analizza l'espressione nello stesso modo ('(1 <= mese) <= 12'). – Pointy

+2

Non confrontare Javascript e Java. Non sono fatti per lo stesso scopo. Java è fortemente digitato, javascript non lo è e permetterà più * funky * programmazione in stile – ortis

risposta

10

<= non è associativo, quindi non è possibile utilizzarlo per ripetizione. È possibile specificare con:

1 <= month && month <= 12 

La ragione è che il parser JavaScript analizza 1 <= month <= 12 come:

(1 <= month) <= 12 

Si tratta di una conseguenza della grammatica di JavaScript, che avrebbe potuto definire in altro modo, ma complicherebbe un po 'la faccenda. La maggior parte delle grammatiche definisce le espressioni come:

expr -> [0-9]+ 
expr -> identifier 
expr -> expr '<=' expr 

(con un parser LALR).

E Java utilizza la seguente (approssimativo) di grammatica:

expr -> numExpr '<=' numExpr 
expr -> numExpr 
numExpr -> identifier 
numExpr -> [0-9]+ 
(...and so on...) 

In Java è quindi addirittura impossibile per analizzare tale espressione (a meno che non si esegue un cast che lo rende un numExp di nuovo).


Per la parte JavaScript, perché lo fa tornare sempre true?

Ora (1 <= month) è un valore booleano (vero/1 o falso/0), e che il valore non può essere paragonato (ragionevole) con 12 (0 e 1 sono sempre minore o uguale a 12). Solo linguaggi di programmazione molto limitati supportano tale funzionalità.

+0

* "e tale valore non può essere confrontato (ragionevole) con 12" * Certo che può. È forzato a un numero. –

+0

@squint: sì ma in questo contesto, non ha alcun senso. Matematicamente * a

+0

@squint: e [tag: java] non coercura automaticamente i booleani a int, comunque. –

3

Per quanto riguarda la subquestion

Why does java consider it as an invalid expression?

È perché Java lo valuta seguente modo:

(1 <= month) <= 12 
boolean  <= int 

booleani e int non può essere paragonato a causa del tipo di sicurezza.

3

Il motivo è dovuto a short-circuit evaluation (che è il metodo utilizzato dalla maggior parte dei linguaggi di programmazione per valutare le espressioni logiche). In sostanza ciò che accade è l'espressione viene valutata da sinistra a destra e trasformato strada facendo in modo ...

1 <= month <= 12 

viene valutato come:

true <= 12 
/* or */ 
false <= 12 
:

(1 <= month) <= 12 

che o ti dà

Come si può vedere, in Java (poiché è sicuro dal tipo) si ottiene un errore di tipo. Perché non puoi usare l'operatore <= su un booleano. In JS, i booleans sono sempre <= in un numero (puoi testarlo nella tua console).

Spero che risponda alla tua domanda!