哪个是用c ++打印到控制台的最佳方法?

时间:2018-06-13 10:49:40

标签: c++

我已经阅读了三种使用c ++从各种来源打印到控制台的方法。

  1. 使用using namespace std;然后使用cout CodeBlocks标准
  2. 未使用上述内容并使用std::coutstd::endl; C ++ Primer
  3. 使用printf HackerRank
  4. 哪个更受欢迎?为什么?

5 个答案:

答案 0 :(得分:21)

第2号修正案。 ('\n'using namespace std

为什么?

  1. 因为你应该避免coutSource
  2. 其他原因)因为printf是类型安全而std::endl不是。 Source
  3. << '\n'将强制将输出缓冲区刷新到控制台。除非您特别希望发生这种情况,否则请使用<< "...string\n"或{{1}}。 Source

答案 1 :(得分:4)

除非你真的关心速度,否则cout和printf都没问题。如果你想要更快的运行时,这里有一些指示:

  • 仅使用没有cout的printf。这将比使用printf和cout的混合物或只是cout提供更快的速度。
  • 或仅使用cout但在执行开始时添加以下内容 ios_base::sync_with_stdio(false);cin.tie(NULL);。 printf和cout有两个独立的流,默认情况下它们是同步的。由于这种同步,浪费了大量的运行时间。这两行代码将停止同步,但如果添加这些行,请注意不要使用任何printf,否则打印可能会以随机顺序进行。
  • 除非要刷新输出缓冲区,否则不要使用endl。很多endl可以使代码变慢。请改用cout<<'\n';

答案 2 :(得分:2)

这些是我的调试器代码,在这10年的c ++工作期间帮助了我。

std::ostream &debugRecord (const char* fileName, int lineNum, const char* funcName)
{
    std::lock_guard<std::mutex> lock(streamMutex_);
    return std::cout << "Thread # " << getCurrentThreadId() << " -- "
                     << "(" << fileName << ":" << lineNum << "): " << funcName << std::endl;
}

答案 3 :(得分:1)

你的第一点基本上都是一样的。最好使用std::而不是using namespace std;,因为后者会污染全局命名空间并导致命名冲突。

未提及的是您可以使用using <namespace>::<element>;选择性地公开名称空间的某些部分(例如using std::cout;)。使用您的语句仍然是更好的做法,但这个选项仍然没有暴露整个命名空间那么糟糕。

printf不如cout安全(流<<运营商可以很好地打印您想要的内容),您应该在开始时避免使用它。

答案 4 :(得分:0)

答案很大程度上取决于你想做什么。对于主要使用默认格式cout的输出确实是首选,因为类型安全,并且因为它非常直观。

如果你想要大量格式化你的输出,虽然我只能推荐令人惊讶的多功能和直截了当的printf因为cout中的操纵者很痛苦。是的:printf格式的语法确实让我们习惯了,但它确实值得。只需仔细检查格式字符串,听取编译器的警告,并使用正确的格式说明符,例如for size_t和其他系统相关数据,以保持便携性。

还有一个用于组合流和printf样式格式的增强工具,请参阅https://stackoverflow.com/a/15106194/3150802,但我从未使用过它。也许有人可以评论它的可用性?