2010-03-12 18 views
8

gì hành vi của tôi có thể mong đợi khi tôi chạy mã này:Java làm thời gian, trong khi

Nó sẽ cư xử như:

do { 
    while(testA) { 
     // do stuff 
    }  
} while(testB); 

Hoặc:

if(testA) { 
    do { 
     // do stuff 
    } while(testA && testB); 
} 

Hoặc một cái gì đó hoàn toàn bất ngờ?

Tôi đặt câu hỏi này vì tôi nghĩ điều này khá mơ hồ và đối với những người khác đang tìm kiếm chủ đề này, không phải vì tôi lười để thử nghiệm.

+12

Hành vi bạn mong đợi là đồng nghiệp đánh bạn bằng gậy. – voyager

+0

@voyager May mắn là tôi không có đồng nghiệp nào để theo dõi; cảm ơn cho lời khuyên mặc dù! – Pindatjuh

Trả lời

6

Nó tương đương với khối đầu tiên của bạn:

do { 
    while(testA) { 
     // do stuff 
    }  
} while(testB); 

Các bộ phận có liên quan của Java grammar khi phân tích cú pháp này là:

DoStatement: 
    do Statement while (Expression) ; 

Statement: 
    WhileStatement 

WhileStatement: 
    while (Expression) Statement 

Statement: 
    Block 

Block: 
    { BlockStatements_opt } 

Bạn có thể thấy rằng trình biên dịch Java sẽ phân tích này là do <WhileStatement> while (Expression) ;. Đó là cách hợp lệ duy nhất để phân tích mã mà bạn đã viết.

Hãy nhớ rằng nó không có bất kỳ quy tắc đặc biệt nào để phân tích cấu trúc này. Nó chỉ kết thúc được gây nhầm lẫn cho một con người để đọc do cách bất thường vòng lặp do-while được viết.Trong sử dụng bình thường do-while luôn được viết là do { ... } while với dấu ngoặc nhọn rõ ràng.

1

Câu trả lời là # 1. Nó sẽ tiếp tục lặp lại miễn là testB được thỏa mãn nhưng nó sẽ không thực thi mã nếu testA không hài lòng.

+0

Cú pháp pháp lý (JDK 1.6). Vậy tại sao nó nên là mã bất hợp pháp? Vui lòng giải thích. – Pindatjuh

+0

Bạn nói đúng Tôi đã thử nghiệm nó và câu trả lời là # 1. Tôi đã chỉnh sửa câu trả lời của mình. –

1

"do {} while();" là một cấu trúc, trong khi "while(){}" là một cấu trúc khác.

Không có điều nào như "do while"; bạn vô tình làm tổ họ và lợi dụng thực tế là {} là tùy chọn cho các hướng dẫn đơn lẻ.

Nói cách khác, đây là cú pháp pháp lý:

do System.out.println("Hello World") while (true); 

Và cũng giống như trong if -statements, một khối được coi là một tuyên bố duy nhất.

Đó là để nói, câu trả lời có thể đầu tiên của bạn là một trong những quyền, trong đó "while(){}" là điều duy nhất không được phơi sáng bên trong bên ngoài "do {} while();"

1

Nó hoạt động như

do { 
    while(testA) { 
     // stuff 
    } 
} while(testB); 

Vì vậy, , khối mã đó được phân tách cú pháp theo cách này:

thực hiện {một khối mã} trong khi testB là đúng. Trong đó {một khối mã} là phần bên trong.

Chắc chắn có một chút không phổ biến khi viết mã như vậy :)

0

Tôi không nghĩ mã này là hợp pháp.

do while(testA) { 

     // do stuff 

    } while(testB); 
+0

Đó là. Hãy thử nó và xem. –

3

Nó hoạt động thực sự, nhưng hành vi phụ thuộc vào những điều kiện bạn đang thử nghiệm. Ví dụ. mã này:

int i = 2; 
    int j = 4; 
    do while(j > 0) { 
     i--; j--; 
     System.out.println("i:" + i + " j:" + j); 
} while(i > 0); 

kết quả đầu ra:

i:1 j:3 
i:0 j:2 
i:-1 j:1 
i:-2 j:0 

Vì vậy, nó hoạt động như:

while(j>0) { 

} 

Trong khi đó bằng cách trao đổi các tên biến:

do while(i > 0) { 
    //.. same as above 
} while(j > 0); 

Đầu ra là:

i:1 j:3 
i:0 j:2 

Dường như nó hoạt động giống như trong trường hợp đầu tiên (tức là thời gian đầu tiên được xem xét), nhưng ở đây, ứng dụng không chấm dứt!


Tóm tắt:
Vào thời điểm đó khi testAkhông hài lòng nữa và testB cũng là không hài lòng, mã hoạt động giống như một vòng lặp while(testA){} bình thường.
Nhưng: Nếu, vào thời điểm đó khi testAkhông còn hài lòng, testBvẫn hài lòng, vòng lặp là không thực hiện nữa và kịch bản là không chấm dứt. Điều này chỉ áp dụng nếu điều kiện của vòng lặp "bên ngoài" cần được thay đổi bên trong vòng lặp.

Cập nhật: Và sau khi đọc câu trả lời khác, tôi nhận ra rằng đây chính là hành vi của lồng nhau do-while - while vòng lặp.
Dù sao, bài học kinh nghiệm: Không sử dụng loại cú pháp này vì nó có thể gây nhầm lẫn cho bạn;)

+0

Nó không kết thúc bởi vì khi tôi đạt đến 0, vòng lặp bên trong không chạy nữa - và do đó j không bao giờ đạt được 0, –

+0

Thú vị, điều này rõ ràng là do vòng lặp 'do while' sẽ lặp lại, nhưng nội dung của 'do while' sẽ không lặp vì vòng lặp bên trong không thành công! Cảm ơn bạn đã thử nghiệm. – Pindatjuh