gpt4 book ai didi

C++:为什么此代码仅在使用 '\n' 时才有效?

转载 作者:行者123 更新时间:2023-12-01 14:03:32 24 4
gpt4 key购买 nike

在 Ubuntu 18.04 上使用 g++ 编译时,以下 C++ 代码工作正常:

#include <iostream>

using namespace std;

void wait(){
int t0 = time(0);
while(true){
if(time(0) >= t0 + 1){
return;
}
}
}
int main(){
while(true){
cout << "tick\n"; //Line 15
wait();
}
}

这是一个 tick 的输出每秒出现:
tick
tick
tick
tick
tick

但是,当删除 \n 时在第 15 行,它似乎只是卡在某个地方,什么也没发生。
究竟是什么 \n对代码做了什么?如果我不想在每个循环后都打印新行,我该怎么办? (我认为将其称为 C++ 中的错误会有点傲慢和错误)

另外,我知道这可能是构建延迟功能的一种非常糟糕的方式,我只是在胡闹。

最佳答案

看来您对 std::cout 的实现写入 C 输出流 stdout .和 stdout默认情况下(当连接到终端时)是线路缓冲的。

行缓冲意味着输出在内部进行缓冲,直到将换行符 ( '\n' ) 添加到缓冲区。然后缓冲区被刷新并实际写入终端。

您可以使用 C++ I/O 操纵器显式刷新缓冲区 std::flush ,如

cout << "tick" << std::flush;

这将立即刷新缓冲区并将其写入终端。但是没有换行符。要添加换行符,您可以使用 std::endl :
cout << "tick" << std::endl;  // Add newline and flush

但请注意,此处不需要显式额外刷新,因为换行符本身会刷新缓冲区。使用 std::endl因此,由于换行符,将首先刷新缓冲区一次,然后由于显式刷新语义而刷新空缓冲区。

建议您不要使用 std::flush (或 std::endl )除非您真的必须这样做。在大多数情况下,它并不是真正需要的。

关于C++:为什么此代码仅在使用 '\n' 时才有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60052408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com