C++ 我如何解释ios_base::sync_with_stdio的这种行为(false);cin.tie(空);?

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

实际上,我是通过下面的答案来了解快速输入/输出的

问题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_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。它们现在是独立的)。