【问题标题】:Why not use printf() in C++ [duplicate]为什么不在 C++ 中使用 printf() [重复]
【发布时间】:2014-02-04 08:43:13
【问题描述】:

我们中的许多人早在我们学会使用构造函数和析构函数之前就学会了使用printf()。因此,当需要切换到 C++ 时,许多人会坚持使用printf() 进行控制台输出。

有时你会听到:

printf() 不好,你应该改用cout <<,因为它是 C++

放弃使用printf()而改用cout <<有什么好处?

【问题讨论】:

  • @SLaks:即使您使用 printf 出现类型错误,体面的编译器也会发出诊断。

标签: c++ c printf


【解决方案1】:

C++ faq 声明:

[15.1] 为什么要使用<iostream> 而不是传统的<cstdio>

提高类型安全性、减少错误、允许可扩展性并提供可继承性。 printf() 可以说没有被破坏,而 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”类。

【讨论】:

【解决方案2】:

cout 更加面向对象并提供了一些优势。但我是一名老派开发人员,对printf() 非常满意。虽然这些天我写的控制台应用程序不多,但如果我写的话,我很可能会使用printf()

这是一件好事:你可以选择你最喜欢的。

【讨论】:

  • 而且,在大多数情况下,printf() 比无穷无尽的>> 运算符序列更具可读性。通常,您可以查看 printf() 格式字符串并查看输出将采用的形式。实际上,您可以将 printf() 格式字符串视为与格式化输出的问题域匹配的“域特定语言”。从这个意义上说,C++ I/O 是一个巨大的倒退——你不能看一眼所有>> 运算符并快速了解输出的样子。 C++ I/O 是一个失败的实验,恕我直言。要喜欢它,您必须关注类型安全并忽略您放弃的所有内容...
猜你喜欢
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 2015-03-29
  • 2021-05-06
  • 2013-07-01
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多