2014-01-15 82 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是一个失败的实验,恕我直言。要喜欢它,你必须专注于类型安全,并忽略你放弃的一切...... –

相关问题