我用C ++编写了一个简单的代码。但是突然我的代码输出出现了一种奇怪的行为。我不明白为什么我在这里遇到这种类型的问题。
下面是我的简单C ++代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long int lli;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cout<<"Hi\n";
lli a[] = {1,2,3,4,5,6,7};
cout<<"Original Array : ";
for(int i=0;i<7;i++)
cout<<a[i]<<" ";
lli q;
cout<<"\n\nEnter q : ";
cin>>q;
cout<<"q = "<<q<<"\n";
}
这是奇怪的行为:每当我运行我的代码时。它没有打印任何输出消息“ Hi .. and all”。看来,它首先直接要求输入所使用的“ q”变量(如下)。然后,它正在打印所需的输出。我对此行为感到非常困惑。请告诉我为什么我的代码首先要求输入q。然后显示原始行为。
下面是我的代码的输出:
注意:每当我删除这三行内容时:
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
它的表现完全符合要求。我不明白为什么。
答案 0 :(得分:4)
原因是cin.tie(NULL);
。这意味着您要使控制台输入与输出不同步。这意味着控制台输出会尽可能晚地出现(程序结束时)。通常,每当有输入操作挂起时,都会清除(显示)输出缓冲区,但是使用cin.tie(NULL);
则明确表示您不希望这种情况发生。
答案 1 :(得分:3)
C ++输出流被缓冲。当您写入std::cout
时,数据将存储在内存中,并且仅在缓冲区已满或流被明确flush
填充时才会传递到输出设备。直到其中一种情况发生,您发送到std::cout
的输出才会出现在屏幕上。这样做是为了提高性能,因为与写入内存相比,I / O操作非常慢。
默认情况下,std::cout
绑定到std::cin
就像已调用std::cin.tie(&std::cout)
一样。这意味着在std::cin
进行任何读操作之前,它将自动调用std::cout.flush()
。这是一个有用的默认值,因为它可以确保您写入std::cout
的所有提示都将出现在std::cin
块等待输入之前。通过调用std::cin.tie(NULL)
,您已明确选择关闭此功能,因此有责任确保在从std::cout.flush()
读取数据之前明确调用std::cin
,以确保已写入缓冲数据到终端。