C++ 我如何解释ios_base::sync_with_stdio的这种行为(false);cin.tie(空);?
实际上,我是通过下面的答案来了解快速输入/输出的 问题1: 它说如果我使用C++ 我如何解释ios_base::sync_with_stdio的这种行为(false);cin.tie(空);?,c++,performance,C++,Performance,实际上,我是通过下面的答案来了解快速输入/输出的 问题1: 它说如果我使用ios_base::sync_with_stdio(false),它将禁用C和C++风格的输入/输出之间的同步。 因此,根据我的解释,这意味着通过使用这个语句,我将不能在我的C++代码中使用 SCAFF()/Cuff>(即C风格I/O)(如果我错了请更正我)。 但是我的代码即使在使用了ios\u base::sync\u with_stdio(false)之后仍然可以工作 这是密码 int main() { ios_b
ios_base::sync_with_stdio(false)代码>,它将禁用C和C++风格的输入/输出之间的同步。
因此,根据我的解释,这意味着通过使用这个语句,我将不能在我的C++代码中使用<代码> SCAFF()/Cuff>(即C风格I/O)(如果我错了请更正我)。
但是我的代码即使在使用了ios\u base::sync\u with_stdio(false)之后仍然可以工作代码>
这是密码
int main()
{
ios_base::sync_with_stdio(false);
long test; cin>>test;
while(test--)
{
ull f=0,t=0,a,b,c,d,k;
scanf("%llu %llu %llu %llu %llu",&a,&b,&c,&d,&k); //scanf() used
while(f<k){ //
t++; //Irrelevant from a question perspective
f=a*(t*t*t)+b*(t*t)+c*t+d; //
} //
if(f==k)
cout<<(t)<<"\n";
else
cout<<(t-1)<<"\n";
}}
/* Expected behaviour
2 input(no of test)
2 2 2 2 10 input(a b c d k)
1 output
2 3 5 7 1000 input
7 output
Behavior of this code
2
2 2 2 2 10 input
2 3 5 7 1000 input(prompted)
1 output
7 output
*/
intmain()
{
ios_base::与_stdio同步(false);
长期试验;cin>>试验;
而(测试--)
{
ull f=0,t=0,a,b,c,d,k;
scanf(“%llu%llu%llu%llu%llu”、&a、&b、&c、&d、&k);//使用scanf()
而(fQuestion 1
不,这并不意味着不能同时使用这两个I/O,但同时使用这两个I/O会导致非常困难的结果预测(两个I/O的交错很难预测)
由于这个原因,你不应该在同一代码中使用这两种代码。在C++中总是使用C++ I/O。只有在使用C I/OS的外部库时使用该控件。
问题2
无tie
与sync_with_stdio
无关。tie
的基本思想是确保在获取输入之前始终打印提示。cout
与cin
绑定意味着cout
将被刷新(如果需要)在任何cin
使用之前。你没有真正理解的是与事物同步意味着什么,以及什么是标准输入和标准输出
标准输入和标准输出是流程的全局资源。每个流程都有一个标准输入和一个标准输出。cin
表示从标准输入读取的单一方式。但是scanf
是从标准输入读取的另一种方式
标准输入是全局的。因此,如果一种读取数据的方法读取某些内容,那么另一种方法会出现并尝试读取内容,那么第二种方法尝试读取的内容可能不再存在。下面是一个可能发生这种情况的示例
语句cin>>test;
将从标准输入中读取一些内容。读取多少内容?好吧,它至少能够读取一个long
类型。但是cin
完全能够读取更多内容。通常,cin
将根据内部缓冲区大小读取数据
目前,您的初始输入仅为2
。但是,不必如此。它可能是2 10
cin>>test;
仍将只读取单个整数。其余将是未读输入,将由下一个cin
读取命令处理
但是,该未读输入是否仍会在全局标准输入中?可能不会;cin
可能会读取所有数据并将其推入内部缓冲区。一旦发生这种情况,标准输入将不包含任何内容。哦,是的,使用cin
将处理剩余的210
输入
但是使用scanf
不会。为什么?因为它不知道cin
的内部缓冲区。它只从标准输入读取。对于scanf
也是如此。它可以有自己的未读输入的内部缓冲区,而cin
无法读取
嗯,除非你同步两个系统。这正是sync\u with_stdio
的作用:当它被设置为true
(默认为),标准流上的操作将在两个系统之间工作。cin
可以读取一些字符,scanf
可以读取一些其他字符,两者都不会遗漏任何内容
但是,如果不同步它们,则不应尝试在同一应用程序中同时使用这两个系统。这样做可能会导致输入丢失或输出顺序不正确
cin.tie
的行为正是您链接到的答案所说的:它确保在尝试读取标准输入之前,写入标准输出的内容将显示给用户
但是,这仅适用于cin
,并且cout
scanf
不一定参与这种捆绑行为(无论同步是否处于活动状态)因此,如果在scanf
语句开始从标准输入读取之前,cout
语句将显示任何标准输出,则未定义
所以cin.tie
不适用于您。不,这只意味着将printf
与cout
和scanf
与cin
相结合将导致未定义的行为,因为它们将使用单独的缓冲。这应该是有用的:还有:@Let\u Me\u be这不是未定义的行为,标准只是说I/O只是独立:使用假参数调用,它允许标准流独立于标准C流运行。很难预测发生了什么,但它是可预测的。OP首先使用了cin>>t
,其中2进入t
,您说随后的输入插入到cin的中内部缓冲区
。自那时起,用户已完成了ios\u base::与stdio同步(false)
我们知道现在scanf和cin有独立的缓冲区,那么为什么其余的输入被插入cin的缓冲区,而不是下次scanf读取它们。我希望cin和scanf独立工作,不会干扰彼此的工作。现在,稍后在scanf期间(“%llu%llu%llu%llu%llu”、&a、&b、&d、&k)
,由于使用了scanf,当cin不知道scanf在做什么时,它如何将这些值插入到a、b、c、d中(bcz。它们现在是独立的)。