2

在您声明此问题与thisthat重复之前,请考虑我已使用and got WA向在线法官\n提交了一个问题,然后使用std::endland got AC。所以,我需要一个非常具体的关于平台意识的答案:\n真的是平台意识的,并且运行时真的根据平台写出正确的行尾作为其他问题的答案吗?如果是这样,你能告诉我这是怎么发生的吗?

如果答案可以得到标准中关于平台意识问题的引用的支持,我将非常感激。我已经阅读了所有其他问题的答案(甚至是封闭的答案),所以请不要重复“刷新缓冲区”的事情。

4

2 回答 2

5

C++11, §27.7.3.8-

namespace std
{
    template <class charT, class traits>
        basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
}

效果:调用 os.put(os.widen('\n')),然后调用 os.flush()。

返回:os。

因此,从标准来看,很明显会endl刷新输出流缓冲区,而\n不会。通常你会想用它endl来打印一个新行,但你也应该记住,每次你这样做时,输出缓冲区也会被刷新。

关于平台意识

从标准来看,很明显两者都做了完全相同的事情——以完全相同的方式打印新行。因此,如果一个是平台独立的,那么另一个也应该是相同的。因为我肯定知道endl是平台独立的,所以\n.

于 2012-03-14T09:42:56.733 回答
5

std::endl是一个输出'\n',然后刷新流的操纵器。对于大多数随意使用,这是您应该使用的。但是,当输出大量数据时,可能会导致性能显着下降,在这种情况下,请使用'\n'.

编辑:

关于平台意识:两者输出完全相同的东西。如果流是以文本模式打开的,'\n'将导致出现与平台相关的行结束表示:Unix 下为 0x0A,Windows 下为 0x0D,0x0A,在某些大型机下开始一条新记录等。如果流以二进制打开模式,它将导致输出单个字节(通常为 0x0A,但实际上取决于所使用的基本字符编码)。

于 2012-03-14T09:44:01.197 回答