在c+;中打印到控制台的最佳方式是什么+;? 我已经阅读了三种方法,可以从各种来源在C++中向控制台打印东西。p> 使用使用名称空间std然后使用cout(代码块标准) 不使用上述内容,并使用std::cout和std::endl(C++入门) 使用printf(HackerRank)

在c+;中打印到控制台的最佳方式是什么+;? 我已经阅读了三种方法,可以从各种来源在C++中向控制台打印东西。p> 使用使用名称空间std然后使用cout(代码块标准) 不使用上述内容,并使用std::cout和std::endl(C++入门) 使用printf(HackerRank),c++,C++,首选哪一种?为什么?您的第一点做的基本相同。最好使用std::而不是使用名称空间std代码>。大量的Entl可以使代码变慢。使用 CUT> P>这是我的调试器代码,在C++工作的10年中帮助了我。 std::ostream &debugRecord (const char* fileName, int lineNum, const char* funcName) { std::lock_guard<std::mutex> lock(streamMutex_);

首选哪一种?为什么?

您的第一点做的基本相同。最好使用
std::
而不是
使用名称空间std
没有提到的是,您可以通过
使用::;有选择地公开命名空间的一部分(例如使用std::cout;
)。更好的做法是使用冗长的语句,但是这个选项仍然没有公开整个名称空间那么糟糕

printf
不如
cout
安全(流
第2号,经过修改。(
std::cout
'\n'

为什么?

  • 因为您应该避免使用命名空间std
  • (除其他原因外)因为
    cout
    是类型安全的,而
    printf
    不是

  • std::endl
    将强制将输出缓冲区刷新到控制台。除非您特别希望这样做,否则请使用
    除非您真正关心速度,否则cout和printf都可以。如果您希望更快的运行时,以下是几点提示:

    • 只使用printf而不使用cout。这将比混合使用printf和cout或just cout提供更高的速度
    • 或者只使用cout,但在执行开始时添加以下内容
      ios\u base::与stdio同步(false);cin.tie(NULL);
      。printf和cout有两个单独的流,默认情况下它们是同步的。由于这种同步,浪费了大量的运行时间。这两行代码将停止同步,但请注意,如果添加这些行,请不要使用任何printf,否则打印可能会以随机顺序进行

    • 除非使用刷新代码,否则不要使用<代码> EntL>代码>。大量的Entl可以使代码变慢。使用<代码> CUT> P>这是我的调试器代码,在C++工作的10年中帮助了我。
      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;
      }
      
      std::ostream&debugRecord(const char*fileName,int lineNum,const char*funcName) { std::lock_guard lock(流互斥锁);
      return std::cout答案在很大程度上取决于您想要做什么。对于主要使用默认格式的输出,由于类型安全性和直观性,确实首选
      cout

      如果你想大量格式化你的输出,尽管我只能推荐令人惊讶的多功能和直接的
      printf
      ,因为cout中的操纵器很麻烦。没错:
      printf
      格式语法确实需要一些时间来适应,但它肯定是值得的。只需仔细检查格式字符串,听听w了解您的编译器,并使用适当的格式说明符,例如用于
      size\t
      和其他依赖于系统的数据,以保持可移植性


      还有一个用于组合流和代码> PrtufF格式化的升力工具,请参阅,但我从来没有使用过它。也许有人可以评论它的可用性。

      1和2都是相同的。使用<代码> Prtff<代码>不是类型安全的。请重复,请漂亮,不要尝试从HACKERAKAN.THA学习C++。t将非常糟糕。另请参见:由于名称空间污染,在全局范围内使用
      使用名称空间std
      是不好的做法(请参见)特别是作为初学者,我建议不要每次都使用
      使用名称空间std;
      并指定
      std::
      ,只是为了习惯阅读这样的代码。但正如您所说的,它可能会变得非常固执己见。@AlexMeuer在名称空间范围的标题中放置
      使用名称空间…
      ,这几乎被普遍认为是错误的不过,Practice在这里更具体一点。printf对我来说做得不太好,让我感到困惑,所以我用cout做了它并得到了很好的结果。此外,您还应该提到您使用的并发API需要哪些头(getCurrentThreadId()
    来自哪里?)getCurrentThreadId()是我以前写过的函数。但是如果你需要它,请告诉我在这里为你写。不,没有必要;但是你应该在回答中提到这一点,并让它清楚地表明你的代码只是一个建议或模板,没有任何东西可以直接复制和粘贴。尽管OP的问题可能更一般,但我还是喜欢它。你为什么使用
    std::cout
    进行调试,而不是
    std::clog
    (它正是为此目的提供的)?您真的不希望日志记录与程序输出混淆!如果您想要速度,请不要打印。写入文件。