cout c ++中的奇怪行为

时间:2013-11-29 16:42:08

标签: c++ pointers cout

说明:cout中,我希望插入运算符<<传递的所有值都显示在屏幕上。

通常人们会认为以下代码无故障运行:

int n = 0;
cout << n;

确实如此,是的,始终使用endl是一种好习惯。但我遇到的问题非常奇怪(至少对我来说)。

问题: 我有以下代码:

cout << " value at array point 0: "  << (list)[length -1] << endl;
cout << " Retry: " << (list)[length - 1];

list是一个指向整数数组的0索引内存位置的指针。 length是数组长度。你会想象这段代码没有错误,对吗?错误。由于某种原因,第二行不会显示 - 我没有丝毫的线索为什么。然后,出于好奇,我将endl添加到" Retry: "的末尾,并且它有效。我不知道为什么,这真的很困扰我。

提前感谢所有帮助!



代码的基本概述

// Prototype
void listAdd( int* list, int& length );

int main()
{
   /* this program was created for practice with dynamic memmory with arrays.
   It should be able to extend the list, destroy it, and pop from it.
   */
    int length = 0;
    int *list = NULL;

    for( int i = 0; i < 5; i ++)
    {
        listAdd( list, length );
        //listDisplay( list, length);
    }

    cout << " if this has been displayed the program ended correctly." << endl;
    return 0;
}


void listAdd(int *list, int &length) {

    int* tempList = new int[ length + 1 ];
    for( int i = 0; i < length; i ++ )
    {
        (tempList)[i] = (list)[ i ];
    }


    cout << " Enter a number: ";
    int stored = 0;
    cin >> stored;

    cout << endl;
    if ( list != NULL )
        delete[] list;

    cout << " Previous adress: " << hex << list << endl;
    list = tempList;
    cout << " New address: " << hex << list << endl << dec;

    length ++;
    cout << " Length: " << length << endl;
    (list)[length -1] = stored;
    cout << " value at array point 0: "  << (list)[length -1] << endl;
    cout << " Retry: " << (list)[length - 1];
}

6 个答案:

答案 0 :(得分:5)

您需要手动刷新流。您应该在发布的代码后使用“cout.flush()”。

“std :: cout&lt;&lt; std :: endl”的作用是 - 它打印'\ n'符号,然后刷新流(与std::cout.flush()相同。

P.S。使用“endl”总是一个好习惯是不正确的。您通常应使用'\ n'来打印新的线符号。并且只在这类情况下使用std::endl

答案 1 :(得分:5)

流式输出被写入缓冲区,并且在刷新流之前可能无法写入最终目标。 std::endl将插入行尾,然后刷新。您可以插入std::flush或调用flush()成员函数,在不插入行尾的情况下进行刷新,如果这是您想要的。

  

总是使用“endl”

是一种好习惯

不是真的。经常刷新,特别是在写入文件时,会降低性能。

答案 2 :(得分:3)

endl刷新stdout流。您的输出可能只是在等待打印到屏幕的缓冲区中。这种行为没有任何问题(除了你确实期待别的东西)。

尝试使用手册flush代替endl。这应该导致相同的行为。

答案 3 :(得分:3)

引用cppreference

  

将一个endline字符插入到输出序列os中并将其刷新,就像调用os.put(os.widen('\ n'))后跟os.flush()一样。

所以输出就在缓冲区中。输出更多东西 - 或明确刷新 - 将导致它被显示。

我同意其他答案,说明不必要地添加std::endl或更多通常比你需要更频繁地冲洗不是一个好习惯。

答案 4 :(得分:2)

如果您在第二个输出的末尾添加了std::endl并且它有效,那是因为endl刷新了流缓冲区。否则,您正在等待下一个缓冲区写入屏幕(如果您的程序在此之前退出,您可能在关闭窗口之前没有看到它 - 它会将其写出来并几乎立即关闭程序)。 / p>

答案 5 :(得分:1)

如果您没有自动执行此操作,则需要刷新流。

发送换行符(endl)将导致流刷新。

如果您确实要刷新并将光标保持在同一行,请添加cout.flush()以显式刷新缓冲的流数据。 e.g:

cout << " value at array point 0: "  << (list)[length -1] << endl;
cout << " Retry: " << (list)[length - 1];
cout.flush();