C stili printf()
(veya puts()
veya putchar()
...) çıktıyı C ++ stili std::cout << ...
çıktıyla karıştırmak güvensiz olabilir. Doğru hatırlıyorsam, ayrı tamponlama mekanizmalarına sahip olabilirler, bu nedenle çıktı istenen sırada görünmeyebilir. (Bir yorumda AProgrammer'den bahsedildiği gibi, bunu sync_with_stdio
ele alır).
printf()
temelde tür güvensizdir. Bir bağımsız değişken için beklenen tür, dize biçimiyle belirlenir ( "%d"
tanıtılan bir int
veya bir şey gerektirir int
, doğru sonlandırılmış bir C stili dize vb. Göstermesi gerekir), ancak yanlış türde bir argümanın iletilmesi tanımsız davranışla sonuçlanır , teşhis edilebilir bir hata değil. Gcc gibi bazı derleyiciler, tür uyuşmazlıkları hakkında oldukça iyi bir uyarı işi yaparlar, ancak bunu yalnızca biçim dizesi değişmezse veya derleme zamanında biliniyorsa (en yaygın durumdur) - ve böyle yapabilirler. dil için uyarı gerekmez. Yanlış türde bir argüman iletirseniz, keyfi olarak kötü şeyler olabilir."%s"
char*
C ++ 'ın akım G / Ç, <<
operatörün birçok farklı tip için aşırı yüklenmesi nedeniyle çok daha güvenli bir tiptir. std::cout << x
türünü belirtmek zorunda değildir x
; derleyici hangi tipte olursa olsun doğru kodu üretecektir x
.
Öte yandan, printf
biçimlendirme seçenekleri IMHO çok daha uygundur. Ondalık noktadan sonra 3 basamaklı bir kayan nokta değeri yazdırmak istersem, kullanabilirim "%.3f"
- ve aynı printf
çağrıda bile diğer argümanlar üzerinde hiçbir etkisi yoktur . C ++ 'lar setprecision
ise akışın durumunu etkiler ve akışı önceki durumuna geri döndürmek için çok dikkatli değilseniz daha sonra çıktıyı bozabilir. (Bu benim kişisel evcil hayvanımdır; kaçınmak için temiz bir yol eksikse, lütfen yorum yapın.)
Her ikisinin de avantajları ve dezavantajları vardır. Kullanılabilirliği printf
özellikle bir C arka planınız varsa ve onu daha iyi biliyorsanız veya C kaynak kodunu bir C ++ programına aktarıyorsanız kullanışlıdır. std::cout << ...
C ++ için daha deyimseldir ve tür uyumsuzluklarından kaçınmak için fazla özen gerektirmez. Her ikisi de geçerli C ++ (C ++ standardı, referans olarak C standart kitaplığının çoğunu içerir).
Bu var muhtemelen kullanmak en std::cout << ...
Kodunuzdaki çalışabilir diğer C ++ programcıları uğruna, ama ya biri kullanabilirsiniz - özellikle iz kodunda sen atmak için gidiyoruz.
Ve elbette hata ayıklayıcıların nasıl kullanılacağını öğrenmek için biraz zaman harcamaya değer (ancak bu bazı ortamlarda mümkün olmayabilir).
printf
C ++ dünyasında? Burada bir şey mi eksik?