"\n"或"\n"或std :: endl到std :: cout?

Som*_*ude 90 c++ string character

自从我std::endl在写作时停止使用结束行std::cout并开始使用以来已经很多年了"\n".

但现在我开始看到更多的代码片段'\n',我开始想知道什么是最好的.

除了显而易见的是一个字符串,另一个字符,使用它有任何好处:

std::cout << variable << '\n';
Run Code Online (Sandbox Code Playgroud)

在此:

std::cout << variable << "\n";
Run Code Online (Sandbox Code Playgroud)

迟到:

当我问这个问题时,我似乎认为换行'\n'刷新了缓冲区.现在我知道这取决于.

默认情况下std::cin,绑定到旧的C stdin FILE*流,并std::cout绑定到stdout.新线上的冲洗来自这种搭售.默认情况下stdout,如果连接到终端,则进行行缓冲.这意味着新行将刷新其缓冲区.因此,当使用打印换行符std::cout时,将导致stdout刷新.

如果stdout未连接到的终端(例如,输出已经被重定向或用管道输送),或者如果之间的联系std::coutstdout被打破,则换行符将不刷新任何东西.

sbi*_*sbi 101

实际上,'\n'应该是默认值.除非您还要显式刷新流(以及何时以及为什么要这样做?),否则根本不需要使用std::endl.1
当然,许多书籍和教程std::endl都是默认使用的.这是不幸的,可能导致严重的性能错误.

我认为使用'\n'或使用之间没有什么区别"\n",但后者是一个(两个)字符数组,必须逐字符打印,必须设置一个循环,这比输出单个字符更复杂.当然,在执行IO时,这很少重要,但如果有疑问,当您想输出一个字符文字时,输出一个字符文字,而不是整个字符串文字.
这样做的一个很好的副作用是你在代码中传达你打算只输出一个字符,而不是偶然地做到这一点.


1 注意默认std::cout绑定std::cin,这导致std::cout在任何输入操作之前刷新,以便在用户输入内容之前打印任何提示.

  • @JohnDibling:''\n'`与``\n"`肯定是一种微观优化,但为什么还为时过早呢?你可以写两个,那么为什么不写出那个传达你意图的那个_might_更快而且不会慢?它与`++ it`与`it ++`相同:它很少重要,但是当它确实如此时,用它来编写一个在重要的地方更快的那个是值得的. (29认同)
  • @John:同样地,"\n"`是过早的悲观.好的,所以它可能*一些微不足道的数量较慢,这很好,因为你想通过故意编写你认为很慢的代码来证明你对过早优化的风险是明智的.但是你不知道*它慢了,你必须写一些东西,你选择哪个?因为在可理解性方面没有区别,所以我认为写任何一个都是合理的,包括一个天真的猜测,它可能会更快,或者发出更小的代码 (10认同)
  • @John:`++ it`与`it ++`在99.99%的情况下根本不重要.但是既然没关系,为什么不养成使用那些0.01%的速度更快的习惯呢?在很多情况下你需要选择一个默认值:制作一个arg ctors`explicit`,使函数`const`,pre-versus-post-increment,`'\n'``与`std :: endl` ,. ..为什么不尝试_总是这样做?哪一个有优势,无论案件多么罕见,优势有多么微不足道?如果你能选择其中任何一个,为什么不挑选一个有0.01%优势的那个,如果它在剩下的99.99%没有劣势? (5认同)
  • @JohnDibling:我并没有像我应该的那样清楚地解释我的观点.我们在这里没有谈论优化.我们正在谈论选择两种可能性中的一种,其中一种更具表现力,不太可能更慢,而且可能更快. (4认同)
  • @John:我认为问题是关于要养成什么习惯,即"我通常应该做什么 - 鉴于所有选项对我来说都是一样的,根据经验法则是否有任何基础?".关于性能的天真猜测与任何IMO都是一个良好的平局.至于避免使用`std :: endl`,我认为"不要告诉程序做你不想要的额外工作",即使在没有分析的情况下也是完全合理的经验法则.然后,"/ n"是否属于同一类别,无论字符串文字在某种意义上是否比字面文字"更多",它都有点分裂. (3认同)

BЈо*_*вић 14

没有最好的.你用你需要的东西:

  • '\n' - 结束这条线
  • "一些字符串\n" - 一些字符串后面的行结束
  • std::endl - 结束线路并冲洗流

  • @Milan 想象一下水流过管道。冲水会推动水流通过管道,然后等待水流全部通过管道,然后再将更多的水送入。除此之外,在接收者需要之前,水无法通过,因此您必须等待接收者将水吸出的管道,这样您就可以冲掉更多的水。这就是为什么用 endl 冲洗管道很少是一个好主意,因此应该使用“\n”。 (2认同)

jal*_*alf 14

他们做不同的事情."\n"输出换行符(在适当的平台特定表示中,因此它"\r\n"在Windows上生成),但std::endl执行相同操作并刷新流.通常,您不需要立即刷新流,这只会让您的性能降低,因此大多数情况下都没有理由使用std::endl.