2015-04-02 11 views
6

Próbuję ocenić wyrażenie (1 <= month <= 12) w warunku if.Ocena wyrażenia 1 <= miesiąc <= 12

Ta instrukcja wydaje się być poprawna w javascript, ale nie w Javie.

W Javie

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

zgłasza następujący błąd:

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

w JavaScript,

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

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

Może ktoś proszę wyjaśnić:

  • Jeśli jest to prawidłowe wyrażenie, czy nie?
  • Dlaczego zawsze ustępuje pod true w javascript?
  • Dlaczego java uważa to za nieprawidłowe wyrażenie?

Również wiem, że mogę go uruchomić w ten sposób (1 <= month && month <= 12). Więc nie szukam rozwiązania, ale wyjaśnienie.

Dzięki. Daj mi również znać, jeśli moje pytania nie są jasne.

+0

To jest poprawne wyrażenie (w JavaScript, nie Java), ale nie robi to, co myślisz robi. Java nie pozwoli ci przeprowadzić porównania między liczbą a wartością logiczną, ale analizuje wyrażenie w ten sam sposób ('(1 <= miesiąc) <= 12"). – Pointy

+2

Nie należy porównywać kodu JavaScript i Java. Nie są wykonane w tym samym celu. Java jest silnie wpisana, javascript nie jest i pozwoli na bardziej * funky * styl programowania – ortis

Odpowiedz

10

<= nie jest skojarzeniowe, więc nie można go używać przez powtarzanie. Można określić go z:

1 <= month && month <= 12 

Powodem jest to, że parser JavaScript analizuje 1 <= month <= 12 jak:

(1 <= month) <= 12 

To konsekwencja gramatyki JavaScript, mogliby określono to inaczej, ale to trochę komplikowałoby sprawę. Większość gramatyk definiuje wyrażenia jako: parser:

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

(z LALR).

I Java wykorzystuje następujące (przybliżona) Gramatyka:

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

W Javie Jest więc nawet niemożliwe do analizowania takich wypowiedzi (chyba wykonać odlew, który sprawia, że ​​jest on numExp ponownie).


Dla części JavaScript, dlaczego to zawsze powrócić true?

Teraz (1 <= month) jest wartość logiczna (prawda/fałsz lub 1/0) oraz, że wartość ta nie może być porównywana (rozsądny) z 12 (0 i 1 są zawsze mniejsze lub równe 12). Tylko bardzo ograniczone języki programowania obsługują taką funkcję.

+0

* "i tej wartości nie da się porównać (rozsądnie) z 12" * Pewnie, że może. Jest przymuszony do liczby. –

+0

@ squint: tak, ale w tym kontekście nie ma to żadnego sensu. Matematycznie * a

+0

@ squint: and [tag: java] nie zmusza automatycznie booleansa do int. –

3

Odnośnie subquestion

Why does java consider it as an invalid expression?

to dlatego Java ocenia to w następujący sposób:

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

Boolean i ints nie można porównywać ze względu na bezpieczeństwo typu.

3

Przyczyna jest spowodowana short-circuit evaluation (która jest metodą używaną przez większość języków programowania do oceny wyrażeń logicznych). Zasadniczo to, co się dzieje, to wyrażenie jest oceniane od lewej do prawej i przekształcony po drodze więc ...

1 <= month <= 12 

Gets oceniano jako:

(1 <= month) <= 12 

która albo daje:

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

Jak widać, w Javie (ponieważ jest to bezpieczny typ) pojawia się błąd typu. Ponieważ nie można użyć operatora <= na wartości logicznej. W JS, booleans są zawsze <= na liczbę (możesz przetestować to na swojej konsoli).

Mam nadzieję, że odpowiedź na Twoje pytanie!