Trộn đầu ra kiểu C printf()
(hoặc puts()
hoặc putchar()
hoặc ...) với đầu ra kiểu C ++ std::cout << ...
có thể không an toàn. Nếu tôi nhớ lại một cách chính xác, chúng có thể có các cơ chế đệm riêng biệt, do đó đầu ra có thể không xuất hiện theo thứ tự dự định. (Như AProgrammer đề cập trong một bình luận, sync_with_stdio
giải quyết vấn đề này).
printf()
về cơ bản là không an toàn. Loại dự kiến cho một đối số được xác định bởi chuỗi định dạng ( "%d"
yêu cầu int
hoặc một thứ gì đó khuyến khích int
, "%s"
yêu cầu char*
phải trỏ đến chuỗi kiểu C kết thúc chính xác, v.v.), nhưng chuyển loại đối số sai dẫn đến hành vi không xác định , không phải là một lỗi có thể chẩn đoán. Một số trình biên dịch, chẳng hạn như gcc, thực hiện công việc cảnh báo khá hợp lý về kiểu không khớp, nhưng chúng chỉ có thể làm như vậy nếu chuỗi định dạng là một chữ hoặc được biết đến vào thời gian biên dịch (là trường hợp phổ biến nhất) - và như vậy cảnh báo không được yêu cầu bởi ngôn ngữ. Nếu bạn vượt qua loại lập luận sai, những điều xấu tùy tiện có thể xảy ra.
Mặt khác, luồng I / O của C ++ an toàn hơn nhiều loại, vì <<
toán tử bị quá tải cho nhiều loại khác nhau. std::cout << x
không phải chỉ định loại x
; trình biên dịch sẽ tạo mã đúng cho bất kỳ loại nào x
có.
Mặt khác, printf
các tùy chọn định dạng của IMHO thuận tiện hơn nhiều. Nếu tôi muốn in một giá trị dấu phẩy động có 3 chữ số sau dấu thập phân, tôi có thể sử dụng "%.3f"
- và nó không có tác dụng đối với các đối số khác, ngay cả trong cùng một printf
cuộc gọi. setprecision
Mặt khác, C ++ ảnh hưởng đến trạng thái của luồng và có thể gây rối cho đầu ra sau này nếu bạn không cẩn thận khôi phục luồng về trạng thái trước đó. (Đây là tiểu thư thú cưng của tôi; nếu tôi thiếu một số cách sạch sẽ để tránh nó, xin vui lòng bình luận.)
Cả hai đều có ưu điểm và nhược điểm. Tính khả dụng của printf
đặc biệt hữu ích nếu bạn có nền C và bạn quen thuộc hơn với nó hoặc nếu bạn đang nhập mã nguồn C vào chương trình C ++. std::cout << ...
là thành ngữ hơn cho C ++ và không cần nhiều sự quan tâm để tránh sự không phù hợp với kiểu. Cả hai đều là C ++ hợp lệ (tiêu chuẩn C ++ bao gồm hầu hết thư viện chuẩn C theo tham chiếu).
Có lẽ tốt nhất là sử dụng std::cout << ...
cho các lập trình viên C ++ khác, những người có thể làm việc với mã của bạn, nhưng bạn có thể sử dụng một trong hai - đặc biệt là trong mã theo dõi mà bạn sẽ vứt đi.
Và tất nhiên, đáng để dành thời gian học cách sử dụng trình gỡ lỗi (nhưng điều đó có thể không khả thi trong một số môi trường).
printf
trong thế giới C ++? Tôi đang thiếu một cái gì đó ở đây?