2013-08-09 46 views
6
#include <iostream>                

using namespace std; 

int main() 
{ 
    cout << 1; 
    while (true); 
    return 0; 
} 

Tôi nghĩ rằng chương trình này sẽ in 1 và sau đó treo. Nhưng nó không in bất cứ thứ gì, nó chỉ bị treo. cout << endl hoặc cout.flush() có thể giải quyết vấn đề này, nhưng tôi vẫn muốn biết tại sao nó không hoạt động như mong đợi :) Sự cố này xuất hiện trong cuộc thi codeforces và tôi dành rất nhiều thời gian để xem xét hành vi kỳ lạ của chương trình. Nó không chính xác, nó cũng bị treo, đầu ra ẩn thực sự là thông tin gỡ lỗi.Sự cố với đầu ra giao diện điều khiển C++

Tôi đã thử sử dụng printf (biên soạn bằng gcc) và nó hoạt động cũng như cout, vì vậy câu hỏi này cũng có thể được tham chiếu đến C.

+2

Bạn đã biết rằng 'tuôn ra 'thay đổi hành vi (' << endl' cũng bị xóa hoàn toàn). Bạn có thể đọc những gì 'tuôn ra'. Còn gì khác để nói không? – Jon

+1

Không thể repro, bản in này 1 với VS2012 – Borgleader

+0

Tôi sử dụng g ++ và linux. –

Trả lời

8

Bạn ghi vào bộ đệm. Bạn cần xóa bộ đệm. Như @Guvante đã đề cập, hãy sử dụng cout.flush() hoặc fflush(stdout) cho printf.

Cập nhật:

Hình như fflush thực sự hoạt động với cout. Nhưng đừng làm điều đó - nó có thể không phải là sự thật trong mọi trường hợp.

+0

Bạn có thể giải thích lý do tại sao nó tuôn ra mà không có 'while (true);'? –

+0

Tôi có nghĩa là 'printf' và C, không phải C++. –

+1

Tất cả các bộ đệm đều bị xóa khi quá trình chấm dứt. – Eugene

2

Đó là do đầu ra bộ đệm cout. Bạn phải xóa bộ đệm để nó thực sự in.

endlflush() cả hai đều thực hiện thao tác xả này.

Cũng lưu ý rằng chương trình của bạn bị treo vì bạn có vòng lặp vô hạn (while(true);).

Lý do nó thực hiện điều này là để nếu bạn đang in nhiều dữ liệu (nói 1000 số), nó có thể hoạt động hiệu quả hơn rất nhiều. Ngoài ra, hầu hết các điểm dữ liệu nhỏ kết thúc với endl dù sao, vì bạn muốn đầu ra của bạn trải rộng trên nhiều dòng.

+1

Từ ngữ của câu hỏi với tôi gợi ý rằng vòng lặp vô hạn là cố ý. – SirGuy

+0

@GuyGreer: Tôi đồng ý, nhưng kể từ khi ';' rất dễ bỏ lỡ cảm thấy cần phải bao gồm bit đó. Đặc biệt với thông báo "Tôi nhận được mã này từ đâu đó". – Guvante

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