Mencampur keluaran gaya-C printf()
(atau puts()
atau putchar()
...) dengan std::cout << ...
keluaran gaya C ++ bisa tidak aman. Jika saya ingat dengan benar, mereka dapat memiliki mekanisme buffering yang terpisah, sehingga output mungkin tidak muncul dalam urutan yang dimaksud. (Seperti yang disebutkan oleh Pemrogram AP dalam komentar, atasi sync_with_stdio
ini).
printf()
pada dasarnya tipe-tidak aman. Jenis yang diharapkan untuk suatu argumen ditentukan oleh string format ( "%d"
memerlukan int
atau sesuatu yang dipromosikan int
, "%s"
membutuhkan char*
yang harus menunjuk ke string gaya-C yang dihentikan dengan benar, dll.), Tetapi meneruskan jenis argumen yang salah menghasilkan perilaku yang tidak terdefinisi , bukan kesalahan yang dapat didiagnosis. Beberapa kompiler, seperti gcc, melakukan pekerjaan peringatan yang cukup baik tentang ketidakcocokan jenis, tetapi mereka dapat melakukannya hanya jika format string adalah literal atau dikenal pada waktu kompilasi (yang merupakan kasus paling umum) - dan semacamnya peringatan tidak dibutuhkan oleh bahasa. Jika Anda melewati jenis argumen yang salah, hal-hal buruk yang sewenang-wenang dapat terjadi.
Aliran C ++ I / O, di sisi lain, jauh lebih aman untuk jenis, karena <<
operator kelebihan beban untuk berbagai jenis. std::cout << x
tidak harus menentukan jenis x
; kompiler akan menghasilkan kode yang tepat untuk tipe apa pun x
.
Di sisi lain, printf
opsi pemformatan adalah IMHO jauh lebih nyaman. Jika saya ingin mencetak nilai titik-mengambang dengan 3 digit setelah titik desimal, saya dapat menggunakan "%.3f"
- dan itu tidak berpengaruh pada argumen lain, bahkan dalam printf
panggilan yang sama . setprecision
Sebaliknya, C ++ mempengaruhi kondisi aliran, dan dapat mengacaukan keluaran nanti jika Anda tidak terlalu berhati-hati untuk mengembalikan aliran ke keadaan sebelumnya. (Ini adalah kencing hewan peliharaan pribadi saya; jika saya kehilangan beberapa cara bersih untuk menghindarinya, silakan berkomentar.)
Keduanya memiliki kelebihan dan kekurangan. Ketersediaan printf
sangat berguna jika Anda memiliki latar belakang C dan Anda lebih mengenalnya, atau jika Anda mengimpor kode sumber C ke dalam program C ++. std::cout << ...
lebih idiomatis untuk C ++, dan tidak memerlukan banyak perawatan untuk menghindari ketidakcocokan tipe. Keduanya valid C ++ (standar C ++ mencakup sebagian besar pustaka standar C dengan referensi).
Ini mungkin terbaik untuk menggunakan std::cout << ...
untuk kepentingan C ++ programmer lain yang dapat bekerja pada kode Anda, tetapi Anda dapat menggunakan salah satu - terutama dalam kode jejak bahwa Anda akan membuang.
Dan tentu saja ada baiknya menghabiskan waktu belajar bagaimana menggunakan debugger (tapi itu mungkin tidak layak di beberapa lingkungan).
printf
di dunia C ++? Saya melewatkan sesuatu di sini?