2015-04-02 17 views
6

Tôi đang cố gắng đánh giá biểu thức (1 <= month <= 12) trong điều kiện if.Đánh giá biểu thức 1 <= tháng <= 12

Tuyên bố này có vẻ hợp lệ trong javascript, nhưng không có trong Java.

Trong Java,

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

Nó throws lỗi sau:

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

Trong javascript,

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

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

Có thể ai đó xin giải thích:

  • Nếu đó là biểu thức hợp lệ hay không?
  • Tại sao nó luôn mang lại hiệu suất cho true trong javascript?
  • Tại sao java coi đó là biểu thức không hợp lệ?

Ngoài ra tôi biết tôi có thể làm cho nó hoạt động theo cách này (1 <= month && month <= 12). Vì vậy, không tìm kiếm một giải pháp mà là một lời giải thích.

Cảm ơn. Ngoài ra hãy cho tôi biết nếu câu hỏi của tôi không rõ ràng.

+0

Đó là một biểu thức hợp lệ (trong JavaScript, không phải Java), nhưng nó không làm những gì bạn nghĩ. Java sẽ không cho phép bạn thực hiện so sánh như vậy giữa một số và một boolean, nhưng nó phân tích cú pháp biểu thức theo cùng một cách ('(1 <= tháng) <= 12'). – Pointy

+2

Không so sánh Javascript và Java. Không được thực hiện cho cùng một mục đích. Java được gõ mạnh mẽ, javascript không và sẽ cho phép nhiều hơn * lập trình phong cách sôi nổi * – ortis

Trả lời

10

<= không liên kết, vì vậy bạn không thể sử dụng nó bằng cách lặp lại. Bạn có thể xác định nó với:

1 <= month && month <= 12 

Lý do là phân tích cú pháp Javascript phân tích 1 <= month <= 12 như:

(1 <= month) <= 12 

Đó là một hệ quả của ngữ pháp của JavaScript, họ có thể đã xác định nó bằng cách khác, nhưng nó sẽ làm phức tạp vấn đề một chút. Hầu hết các ngữ pháp xác định các biểu thức dưới dạng:

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

phân tích cú pháp (với LALR).

Java sử dụng sau đây (xấp xỉ) ngữ pháp:

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

Trong Java nó là như vậy, thậm chí không thể phân tích cú pháp biểu hiện như vậy (trừ khi bạn thực hiện một dàn diễn viên mà làm cho nó một numExp một lần nữa).


Đối với phần JavaScript, tại sao nó luôn luôn trả true?

Bây giờ (1 <= month) là một boolean (true/1 hay sai/0), và giá trị mà không thể so sánh (hợp lý) với 12 (01 luôn nhỏ hơn hoặc bằng 12). Chỉ những ngôn ngữ lập trình rất hạn chế mới hỗ trợ tính năng này.

+0

* "và giá trị đó không thể so sánh (hợp lý) với 12" * Chắc chắn nó có thể. Nó bị ép buộc thành một số. –

+0

@squint: có nhưng trong ngữ cảnh này, nó không có ý nghĩa gì cả. Về mặt toán học * a

+0

@squint: và [tag: java] không tự động ép buộc các boolean vào int. –

3

Về Câu hỏi con

Why does java consider it as an invalid expression?

Đó là bởi vì Java đánh giá nó theo cách sau:

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

Booleans và ints không thể so sánh vì sự an toàn loại.

3

Lý do là do short-circuit evaluation (là phương pháp được hầu hết các ngôn ngữ lập trình sử dụng để đánh giá các biểu thức logic). Về cơ bản những gì xảy ra là sự biểu hiện được đánh giá trái sang phải và chuyển dọc theo con đường như vậy ...

1 <= month <= 12 

Gets đánh giá là:

(1 <= month) <= 12 

nào hoặc cung cấp cho bạn:

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

Như bạn có thể thấy, trong Java (vì nó an toàn kiểu), bạn gặp lỗi kiểu. Bởi vì bạn không thể sử dụng toán tử <= trên boolean. Trong JS, các boolean luôn là <= đến một số (bạn có thể kiểm tra điều này trong bảng điều khiển của mình).

Hy vọng rằng sẽ trả lời câu hỏi của bạn!

Các vấn đề liên quan