2012-10-05 59 views
5

Tôi đã vượt qua câu đố này hôm nay. Rõ ràng, đây không phải là phong cách chính xác, nhưng tôi vẫn tò mò là tại sao không có đầu ra nào sắp ra mắt.Tại sao câu lệnh if của tôi hoạt động theo cách này?

int x = 9; 
int y = 8; 
int z = 7; 

if (x > 9) if (y > 8) System.out.println("x > 9 and y > 8"); 

else if (z >= 7) System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7"); 

else 
    System.out.println("x <= 9 and z < 7"); 

Ở trên không có đầu ra khi chạy. Nhưng, khi chúng ta thêm vào dấu ngoặc cho câu lệnh if, đột nhiên logic hoạt động như tôi mong đợi.

int x = 9; 
int y = 8; 
int z = 7; 

if (x > 9) { 
    if (y > 8) System.out.println("x > 9 and y > 8"); 
} 

else if (z >= 7) System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7"); 

else 
    System.out.println("x <= 9 and z < 7"); 

Kết quả đầu ra này "NÊN OUTPUT NÀY x < = 9 và z> = 7". Chuyện gì đang xảy ra ở đây?

Cảm ơn!

+3

haha ​​... 'else' áp dụng cho cấp lồng bên trong nhất. – Mysticial

Trả lời

7

Nếu bạn viết lại cách đầu tiên như thế này (đó là cách nó là hành xử), nó là dễ dàng hơn để hiểu

if (x > 9) 
    if (y > 8) System.out.println("x > 9 and y > 8"); 
    else if (z >= 7) System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7"); 
    else 
    System.out.println("x <= 9 and z < 7"); 

Kể từ x không> là 9, khối không bao giờ thực hiện.

0

Chỉ cần sửa chữa thụt vào mã của bạn và vấn đề này trở nên rõ ràng:

int x = 9; 
int y = 8; 
int z = 7; 

if (x > 9) 
    if (y > 8) 
     System.out.println("x > 9 and y > 8"); 
    else if (z >= 7) 
     System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7"); 
    else 
     System.out.println("x <= 9 and z < 7"); 
4

này:

if (x > 9) ... if (y > 8) ... else if (z >= 7) ... else 

là mơ hồ, bởi vì trong quá trình phân tích cú pháp else có thể được ràng buộc với if đầu tiên hoặc thứ hai if. (Điều này được gọi là the dangling else problem). Cách Java (và nhiều ngôn ngữ khác) đề cập đến điều này là làm cho ý nghĩa đầu tiên là bất hợp pháp, do đó, các mệnh đề else luôn gắn với các câu lệnh if trong cùng.

+0

Câu trả lời hay nhất, bởi vì nó thực sự giải thích vấn đề được gọi là gì và tại sao nó lại xảy ra như vậy. +1 – Vulcan

0

Bởi vì bạn đang sử dụng khối khác trong hầu hết các mức nội

Mã của bạn đang được xử lý như đoạn mã sau

if (x > 9) // This condition is false, hence the none of the following statement will be executed 
{ 
    if (y > 8) 
    { 
     System.out.println("x > 9 and y > 8"); 
    } else if(z >= 7) 
    { 
     System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7"); 
    } 
    else 
    { 
     System.out.println("x <= 9 and z < 7"); 
    } 
} 

Điều kiện đầu tiên quy định với câu lệnh if là false và kiểm soát trong không vào vào mã được liên kết với điều kiện đó và chỉ cần đến cuối chương trình và không in được gì.

Đó là lý do tại sao thực hành thông thường của nó là gửi kèm theo các câu lệnh với dấu ngoặc ngay cả khi bạn đang viết một câu lệnh.

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