2014-01-15 130 views
0

在我們學習使用構造函數和析構函數之前很久,我們學習了很多使用printf()的知識。因此,當切換到C++時,許多控制檯將輸出printf()爲什麼不在C++中使用printf()

有時候你可以聽到:

printf()是壞的,你應該使用cout <<相反,因爲它是C++

什麼是使用printf()放棄並切換到cout <<的優勢呢?

+2

它是類型安全的。 – SLaks

+1

@SLaks:即使您在使用'printf'進行類型錯誤時,體面的編譯器也會發出診斷信息。 – 6502

回答

3

C++ faq指出:

[15.1]我爲什麼要使用<iostream>代替傳統<cstdio>

增加類型安全性,減少錯誤,允許擴展性並提供可繼承性。 012fprintf()可以說沒有被破壞,並且儘管容易出錯,但scanf()也許是可居住的,但是對於C++ I/O的功能而言,兩者都是有限的。 C++ I/O(使用< <和>>)是相對於C(使用printf()scanf())。

  • 更多類型安全:隨着<iostream>,對象被I/O的類型是由編譯器靜態地已知的。相反,使用「%」字段來動態地確定類型。

  • 不易出錯:使用<iostream>時,沒有多餘的「%」令牌必須與實際的I/O對象一致。刪除冗餘可消除一類錯誤。

  • 可擴展:C++ <iostream>機制允許新的用戶定義類型在不破壞現有代碼的情況下進行I/O。想象一下,如果每個人都同時爲printf()和scanf()添加新的不兼容「%」字段,那麼混亂就會發生?

  • 可繼承:C++的<iostream>機構從真實的類,如std::ostreamstd::istream建造。不像<cstdio>FILE*,這些是真實的類,因此是可繼承的。這意味着你可以擁有其他用戶定義的東西,看起來像流一樣,但它可以做任何你想要的奇怪和美妙的事情。您將自動使用由您甚至不知道的用戶編寫的大量I/O代碼行,並且他們不需要知道您的「extended stream」類。

+0

只是從第一個答案複製http://stackoverflow.com/questions/2872543/printf-vs-cout-in-c(它已經在降價) – ericbn

+0

@ericbn;閱讀我答案的第一行。 :) – haccks

+1

+1用於引用常見問題解答。希望更多的人先搜索FAQ。 –

3

cout是更加面向對象的,並提供一些優點。但我是一位老派開發人員,對printf()非常滿意。雖然,我現在不寫很多控制檯應用程序,但如果我這樣做,我很可能會使用printf()

這是一件好事:你可以選擇你最喜歡的一個。

+0

而且,在大多數情況下,printf()方法*比* >>操作符的連續序列更具可讀性。通常,您可以查看printf()格式的字符串並查看輸出的格式。實際上,您可以將printf()格式的字符串視爲與格式化輸出的問題域匹配的「域特定語言」。從這個意義上說,C++ I/O是一個巨大的後退步驟 - 你不能瀏覽所有那些'>>'運算符,並快速瞭解輸出的結果。 C++ I/O是一個失敗的實驗,恕我直言。要喜歡它,你必須專注於類型安全,並忽略你放棄的一切...... –

相關問題