【问题标题】:printf/scanf usage and difference from <iostream> and cout/cin diffferences, when to use which?printf/scanf 的用法和区别 <iostream> 和 cout/cin 的区别,什么时候用哪个?
【发布时间】:2020-08-26 05:21:58
【问题描述】:

不是关于特定代码的问题,但在 C++ 中,使用 &lt;stdio.h&gt; 的运算符 scanf/printf 在我看来与标题 &lt;iostream&gt; 中的 cout 或 cin 相同,所以任何人都可以解释一下运算符之间的区别,我们为什么以及何时使用其中任何一个?如果之前有人问过这个问题,请谦虚地道歉,但是

谢谢。

【问题讨论】:

  • 虽然 C++ 可以与 C 对话,但 C 和 C++ 是两种不同的语言。在 C++ 中,将数据发送到标准输出的惯用方式是通过 std::cout 对象和 &lt;&lt; 运算符。该对象在标准库头 &lt;iostream&gt; 中定义。 Portable C++ 中的 C 库以 c 为前缀。所以&lt;stdio.h&gt; 变成&lt;cstdio&gt; 并且没有.h 扩展。 C++ 标准库中没有&lt;iostream.h&gt; 标头。
  • 所以它是一个用于输入、输出的库,最初用 C 实现,然后在 C++ 中变得可移植,对吗?
  • 这能回答你的问题吗? C++ Streams vs. C-style IO?
  • 虽然它确实回答了我正在寻找的内容,但它非常详细,我只是对某些术语有些困惑。一些答案说 printf 比 C++ 流更快。究竟是什么方面更快?如果它更快(这可能也意味着更好)为什么在 C++ 中使用不安全?我也不明白一个关于有分歧的答案。
  • 这里我会引用“你不能在对象的类型和格式字符串中指定的类型之间存在分歧”。

标签: c++


【解决方案1】:

scanfprintf 不是运算符。它们是函数。

任何标准版本的 C++ 中的 C++ 标准库中都没有标头 &lt;iostream.h&gt;。您可能正在使用一种古老的 C++ 方言。

什么时候用哪个?

粗略的经验法则:编写 C++ 时使用 std::coutstd::cin。编写 C++ 时不要使用printfscanf

那为什么要导入C++

据我了解,这是为了让 C 程序可以以小的增量步骤转换为 C++。如果您编写了一个使用 C 标准 I/O 的 C 程序,那么您可以用 C++ 重写该程序,而无需完全替换 I/O 部分。这种设计选择可能是为了鼓励现有程序/项目从使用 C 转向使用 C++。

C I/O 函数是为了与 C 向后兼容而存在的残留特性。

【讨论】:

  • 先生,我希望我的问题听起来不是很愚蠢。您的意思是在编写 C++ 代码时不要使用 scanfprintf 那么如果我们不想使用它为什么要导入 C++ 呢?它在 C++ 中肯定有特殊用途,这正是我问的原因。
【解决方案2】:

scanf 和 printf 来自 C 并被 C++ 占用。 std::cout/cin 仅是 C++。

【讨论】:

  • 谢谢您的回答先生。
【解决方案3】:

当输入很大并且从标准输入读取这样的输入的任务可能被证明是一个瓶颈时,常规竞争程序员面临着共同的挑战。此类问题伴随着“警告:大 I/O 数据”。

cin/cout 比 scanf/printf 快,这是它们之间的关键区别。

为什么 scanf 比 cin 快?

在高层次上,它们都是 read() 系统调用的包装器,只是语法糖。唯一明显的区别是 scanf() 必须显式声明输入类型,而 cin 使用模板重载重定向操作。这似乎不足以成为 5 倍性能的充分理由。

原来 iostream 使用了 stdio 的缓冲系统。因此,cin 浪费了时间与底层 C 库的 stdio 缓冲区同步,因此对 scanf() 和 cin 的调用可以交错。

好消息是 libstdc++ 提供了一个选项来关闭所有 iostream 标准流与其对应的标准 C 流的同步

std::ios::sync_with_stdio(false);

与 cout 和 printf 相同。

但简单来说,cin,cout使用c++中的提取和插入,基本上是重载的,因此速度慢的另一个因素。

我希望这能回答你为什么一个比另一个更受欢迎的问题,它们基本上是输入数据的方式,并且在内部 cin、cout 是使用 c stdio 缓冲区库编写的。

【讨论】:

    猜你喜欢
    • 2013-05-22
    • 2013-03-24
    • 2017-06-02
    • 1970-01-01
    • 2011-12-08
    • 2021-11-17
    • 2013-10-29
    • 2014-12-23
    • 1970-01-01
    相关资源
    最近更新 更多