C ++代码在运行时显示奇怪的行为

时间:2019-06-27 12:27:38

标签: c++

我用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。然后显示原始行为。

下面是我的代码的输出:

enter image description here

注意:每当我删除这三行内容时:

ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);

它的表现完全符合要求。我不明白为什么。

2 个答案:

答案 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,以确保已写入缓冲数据到终端。