2013-05-17 39 views
21

Được rồi, vì vậy tôi có đoạn mã này được thử nghiệm và tôi thấy không có bất kỳ ngoại lệ nào được ném ra ngoài.Hai điều kiện trong một câu lệnh if có phải vấn đề thứ hai nếu câu đầu tiên là sai?

public static void main(String[] args) { 
    int[] list = {1,2}; 
    if (list.length>2 && list[3] == 2){ 
     System.out.println(list[1]); 
    } 
} 

Liệu các tuyên bố đây

if (list.length>2 && list[3] == 2) 

có nghĩa là nếu điều kiện đầu tiên là sai, chúng tôi thậm chí không phải kiểm tra điều kiện thứ hai?

Hoặc nó tương đương với

if (list.length>2){ 
    if (list[3] == 2){ 
     ... 
    } 
} 

?

Và điều gì sẽ xảy ra nếu nó được viết bằng C hoặc python hoặc một số ngôn ngữ khác?

Cảm ơn

+1

2 cách tương đương –

+2

Java theo http://en.wikipedia.org/wiki/Short-circuit_evaluation (Đánh giá ngắn mạch) để xác thực biểu thức – Vasu

+1

Đánh giá ngắn mạch cho phép bạn đánh giá các điều kiện sẽ chỉ hợp pháp lâu dài vì điều kiện đầu tiên là hợp pháp. Bạn sẽ thường thấy mã như 'if (string! = Null && string.length> 5)' –

Trả lời

39

Nó được phổ biến cho các ngôn ngữ (Java và Python là trong số đó) để đánh giá đối số đầu tiên của một logic AND và kết thúc thẩm định báo cáo kết quả nếu đối số đầu tiên là false. Điều này là do:

Từ The Order of Evaluation of Logic Operators,

Khi Java đánh giá biểu thức d = b & & c ;, nó kiểm tra đầu tiên cho dù b là đúng.Ở đây b là sai, vì vậy b & & c phải sai bất kể c là hay không đúng, vì vậy Java không bận tâm kiểm tra giá trị của c.

Điều này được gọi là short-circuit evaluation và cũng được gọi trong số Java docs.

Thông thường, hãy xem list.count > 0 && list[0] == "Something" để kiểm tra phần tử danh sách, nếu nó tồn tại.


Nó cũng đáng nói đến là if (list.length>2 && list[3] == 2)không bằng với trường hợp thứ hai

if (list.length>2){ 
    if (list[3] == 2){ 
     ... 
    } 
} 

nếu có một else sau đó. else sẽ chỉ áp dụng cho tuyên bố if mà nó được đính kèm.

Để chứng minh điều này Gotcha:

if (x.kind.equals("Human")) { 
    if (x.name.equals("Jordan")) { 
     System.out.println("Hello Jordan!"); 
    } 
} else { 
    System.out.println("You are not a human!"); 
} 

sẽ làm việc như mong đợi, nhưng

if (x.kind.equals("Human") && x.name.equals("Jordan")) { 
    System.out.println("Hello Jordan!"); 
} else { 
    System.out.println("You are not a human!"); 
} 

cũng sẽ cho bất kỳ con người ai là không Jordan họ không phải con người.

+1

Khối cuối cùng là công bằng. Chỉ có 'Jordan' mới có thể điều hành thế giới. – TheBrenny

+0

Các toán tử bit của Python ('&', '|') ** không ** hỗ trợ đoản mạch. Tuy nhiên, các toán tử sau của Python ** làm **: 'và',' hoặc', 'any',' all' – anilbey

14

Có. Nếu điều kiện đầu tiên không thỏa mãn thì phần còn lại sẽ không được đánh giá. Điều này được gọi là ngắn mạch . Xem here để biết thêm chi tiết. Lưu ý rằng đây không phải là đặc thù đối với Java và nhiều ngôn ngữ khác cũng sẽ làm như vậy.

4

Có, cả hai cách sử dụng đều tương đương ngữ nghĩa ... Tức là, trừ khi độ dài> 2, thì mã được phép truy cập nhiều hơn phần tử thứ 2.

Trong trường hợp đầu tiên, điều quan trọng là các nhà điều hành &&, nghĩ về nó như: Nếu điều kiện đầu tiên là đúng sau đó áp dụng điều kiện thứ hai.

Điều kiện tiếp theo cũng có một tiềm ẩn "sau đó" khoản

if length greater than two 
then access third element 
6

Ngay từ javadoc:

Các nhà khai thác có điều kiện

Các & & và || các toán tử thực hiện các phép toán có điều kiện-AND và có điều kiện-HOẶC trên hai biểu thức boolean. Các toán tử này thể hiện hành vi "ngắn mạch" , có nghĩa là toán hạng thứ hai là chỉ được đánh giá nếu cần.

& & Điều kiện-VÀ || Conditional-OR

3

Nếu điều kiện đầu tiên là sai thì nó sẽ không kiểm tra điều kiện thứ hai vì bất cứ điều gì & & F = F một lần nữa nó phụ thuộc vào hoạt động khôn ngoan mà bạn đang làm. như trong trường hợp của OR (||) nếu điều kiện đầu tiên là đúng (T) nó sẽ không kiểm tra điều kiện thứ hai là bất cứ điều gì || T = T nhưng nếu sai (F) của nó thì chắc chắn sẽ kiểm tra số thứ hai

3

Bạn đã chỉ định trong câu lệnh IF của bạn rằng cả hai điều kiện phải đúng đối với System.out.println sẽ được thực thi. Vì vậy, nếu điều kiện đầu tiên không thành công, điều kiện thứ hai không được kiểm tra (điều này là dành cho toán tử AND). Nhưng điều kiện thứ hai sẽ được cheked nếu bạn đã chỉ định toán tử OR trong câu lệnh If.

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