2013-10-20 21 views

Trả lời

12

Hãy nhìn vào những cách độc lập:

while(cin >> x) { 
    // code 
} 

Vòng lặp này, bằng trực giác, có nghĩa là "giữ giá trị đọc từ cin vào x, và miễn là một giá trị có thể được đọc, tiếp tục vòng lặp." Ngay khi giá trị được đọc không phải là int hoặc ngay sau khi cin bị đóng, vòng lặp kết thúc. Điều này có nghĩa là vòng lặp sẽ chỉ thực hiện trong khi x hợp lệ.

Mặt khác, hãy xem xét vòng lặp này:

while(cin){ 
    cin >> y; 
    //code 
} 

Tuyên bố while (cin) có nghĩa là "trong khi tất cả các hoạt động trước đó trên cin đã thành công, tiếp tục vòng lặp." Khi chúng tôi nhập vòng lặp, chúng tôi sẽ cố đọc giá trị vào y. Điều này có thể thành công, hoặc nó có thể thất bại. Tuy nhiên, bất kể trường hợp nào xảy ra, vòng lặp sẽ tiếp tục thực thi. Điều này có nghĩa là khi dữ liệu không hợp lệ được nhập vào hoặc không có dữ liệu nào để đọc, vòng lặp sẽ thực thi thêm một lần nữa bằng giá trị cũ của y, vì vậy bạn sẽ có thêm một vòng lặp lặp lại cần thiết.

Bạn chắc chắn nên thích phiên bản đầu tiên của vòng lặp này đến vòng lặp thứ hai. Nó không bao giờ thực hiện lặp lại trừ khi có dữ liệu hợp lệ.

Hy vọng điều này sẽ hữu ích!

+0

"và miễn là một giá trị có thể được đọc, tiếp tục lặp" tức là nếu đọc thành công, hãy thực hiện phần thân vòng lặp. – dyp

3

Sự khác biệt là nếu cin >> whatever đánh giá sai, phiên bản thứ hai của bạn vẫn chạy phần còn lại của vòng lặp.

Giả sử cin >> whatever không thành công. Chuyện gì sẽ xảy ra?

while(cin >> x){ 
    // code that DOESN'T RUN 
} 

while(cin){ 
    cin >> y; 
    //code that DOES RUN, even if the previous read failed 
} 
+0

Tôi không nghĩ như vậy khi tôi sử dụng nó trong thẩm phán trực tuyến và kết quả là sai câu trả lời không giới hạn thời gian! –

0

cin >> x sẽ lưu giá trị đầu vào vào x.

Đối với while(cin), std::cin sẽ trả lại boolean về việc liệu cờ lỗi có được đặt hay không. Do đó, bạn sẽ tiếp tục trong vòng lặp while miễn là std::cin không có cờ báo lỗi được đặt trong nội bộ. Có thể đặt cờ báo lỗi nếu tìm thấy ký tự end of file hoặc nếu không đọc được và lưu trữ vào giá trị.

1
while(cin >> x){ 
    // code 
} 

Điều này đọc số nguyên cho đến khi gặp lỗi không phải số nguyên, EOF hoặc lỗi luồng khác. Bất cứ khi nào bạn sử dụng x bên trong vòng lặp, bạn biết nó đã được đọc thành công.

while(cin){ 
    cin >> y; 
    //code 
} 

Điều này đọc số nguyên cho đến khi gặp lỗi không phải số nguyên, EOF hoặc lỗi luồng khác. Tuy nhiên, luồng chỉ được kiểm tra trước khi đọc số nguyên. Khi bạn sử dụng y trong vòng lặp, bạn không thể đảm bảo rằng nó đã được đọc thành công.

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