Banyak buku C ++ berisi contoh kode seperti ini ...
std::cout << "Test line" << std::endl;
... jadi saya selalu melakukan itu juga. Tapi saya telah melihat banyak kode dari pengembang yang bekerja seperti ini sebagai gantinya:
std::cout << "Test line\n";
Apakah ada alasan teknis untuk memilih yang satu daripada yang lain, atau hanya karena gaya pengkodean?
c++
coding-style
iostream
c++-faq
Kepala Geek
sumber
sumber
'\n'
.Jawaban:
Karakter akhir baris yang bervariasi tidak masalah, dengan asumsi file terbuka dalam mode teks, yang adalah apa yang Anda dapatkan kecuali jika Anda meminta biner. Program yang dikompilasi akan menuliskan hal yang benar untuk sistem yang dikompilasi.
Satu-satunya perbedaan adalah
std::endl
flushes buffer output, dan'\n'
tidak. Jika Anda tidak ingin buffer sering memerah, gunakan'\n'
. Jika Anda melakukannya (misalnya, jika Anda ingin mendapatkan semua output, dan program tidak stabil), gunakanstd::endl
.sumber
::std::cerr
alih-alih::std::cout
karena tidak dibuat-buat dan memerah dengan setiap operasi keluaran.stderr
ini untuk "kesalahan". Sebaliknya, itu untuk pesan diagnostik out-of-band, jika Anda mau. Seharusnya dimungkinkan untuk mengatakan./prog > file
dan menyimpan hanya muatan program yang sebenarnya, tetapi program mungkin ingin menghasilkan lebih banyak informasi status, bahkan dalam interaksi normal.Perbedaannya dapat diilustrasikan sebagai berikut:
setara dengan
Begitu,
std::endl
Jika Anda ingin memaksa flush langsung ke output.\n
jika Anda khawatir tentang kinerja (yang mungkin tidak terjadi jika Anda menggunakan<<
operator).Saya menggunakan
\n
sebagian besar baris.Kemudian gunakan
std::endl
di akhir paragraf (tapi itu hanya kebiasaan dan biasanya tidak perlu).Bertentangan dengan klaim lain,
\n
karakter dipetakan ke platform yang benar hanya dari urutan baris jika aliran menuju ke suatu file (std::cin
danstd::cout
menjadi file khusus tetapi tetap (atau seperti file)).sumber
cout
terikatcin
, artinya jika Anda membaca input daricin
,cout
akan memerah terlebih dahulu. Tetapi jika Anda ingin menampilkan progress bar atau sesuatu tanpa membaca daricin
, maka yakin, pembilasan berguna.operator<<
bukan pemain, atau alternatif apa yang digunakan untuk kinerja? Tolong tunjukkan saya ke beberapa bahan untuk memahami ini lebih lanjut.sync_with_stdio(false)
dan jangan menyiram output Anda terus menerus. Biarkan perpustakaan menentukan kapan harus melakukannya. stackoverflow.com/a/1926432/14065sync_with_stdio
membuat iostreams secepat stdio. TidakMungkin ada masalah kinerja,
std::endl
memaksa aliran output.sumber
Ada panggilan fungsi lain yang tersirat di sana jika Anda akan menggunakan
std::endl
a) memanggil operator
<<
satu kali.b) memanggil operator
<<
dua kali.sumber
std::cout << "Hello" << "\n";
?<<
2 dalam kasus a juga, jadi saya tidak akan mengklaim perlunya satu atau dua<<
(atau dua panggilan fungsi secara umum) menjadi perbedaan antara\n
danendl
.Saya ingat pernah membaca tentang ini dalam standar, jadi begini:
Lihat standar C11 yang mendefinisikan bagaimana stream standar berperilaku, ketika program C ++ antarmuka CRT, standar C11 harus mengatur kebijakan pembilasan di sini.
Ini berarti bahwa
std::cout
danstd::cin
sepenuhnya buffered jika dan hanya jika mereka merujuk ke perangkat non-interaktif. Dengan kata lain, jika stdout dilampirkan ke terminal maka tidak ada perbedaan perilaku.Namun, jika
std::cout.sync_with_stdio(false)
dipanggil, maka'\n'
tidak akan menyebabkan flush bahkan ke perangkat interaktif. Sebaliknya'\n'
setara denganstd::endl
kecuali pemipaan ke file: c ++ ref on std :: endl .sumber
Mereka berdua akan menulis karakter end-of-line yang sesuai. Selain itu endl akan menyebabkan buffer berkomitmen. Anda biasanya tidak ingin menggunakan endl ketika melakukan file I / O karena komitmen yang tidak perlu dapat memengaruhi kinerja.
sumber
Bukan masalah besar, tetapi endl tidak akan bekerja dalam meningkatkan :: lambda .
sumber
Jika Anda menggunakan Qt dan
endl
, Anda dapat secara tidak sengaja menggunakan yang salahendl
yang memberi Anda hasil yang sangat mengejutkan. Lihat cuplikan kode berikut:Perhatikan bahwa saya menulis
endl
alih-alihstd::endl
(yang seharusnya sudah benar) dan ternyata adaendl
fungsi yang didefinisikan dalam qtextstream.h (yang merupakan bagian dari QtCore).Menggunakan
"\n"
alih-alihendl
sepenuhnya menghindari potensi masalah namespace. Ini juga merupakan contoh yang baik mengapa menempatkan simbol ke namespace global (seperti Qt tidak secara default) adalah ide yang buruk.sumber
using namespace std;
?? :-)using namespace std;
. Ini dianggap praktik buruk. Lihat Mengapa “menggunakan namespace std;” dianggap praktik yang buruk?Saya selalu punya kebiasaan hanya menggunakan std :: endl karena mudah bagi saya untuk melihatnya.
sumber
The
std::endl
manipulator setara dengan'\n'
. Tapistd::endl
selalu menyiram arus.sumber
Jika Anda berniat untuk menjalankan program Anda selain laptop Anda sendiri, jangan pernah menggunakan
endl
pernyataan itu. Terutama jika Anda menulis banyak baris pendek atau seperti yang sering saya lihat karakter tunggal ke file. Penggunaanendl
ini tahu untuk membunuh sistem file jaringan seperti NFS.sumber
Dengan referensi Ini adalah manipulator I / O keluaran saja .
std::endl
Menyisipkan karakter baris baru ke dalam urutan output os dan flush seolah-olah dengan memanggilos.put(os.widen('\n'))
diikuti olehos.flush()
.Kapan harus menggunakan:
Manipulator ini dapat digunakan untuk menghasilkan garis output segera ,
misalnya
Juga
sumber