36481


タイトルの通り，C言語のprintfに関して,その内容が出力されるタイミングについて疑問があったので，質問しました．  
調べたところ,標準出力の出力先が端末につながっている場合，標準出力はline
bufferedに設定されるということでした.つまり，printf()の内容を出力したい場合,

[code]

    printf("### check\n");
    
[/code]

のように文字列の終端に改行記号を入れてシステム側に１行が終わったことを示すか，

[code]

    printf("### check");
    fflush(stdout);
    
[/code]

のように,fflush()を用いて，明示的にバッファの中身を標準出力先に出力させることのどちらかが必要だということだと理解しました．

しかし,実際には上記のようなことをしなくても，例えば

[code]

    #include<stdio.h>
    
    int main(){
      printf("test line buffering of stdout");
      return 0;
    }
    
[/code]

のように書けば,printfの内容は出力されます.

これはなぜなのでしょうか？line bufferが出力されるタイミングは，前述の2点以外にも,例えばreturn
0;の前など，いろいろあるということでしょうか？  
よろしくお願いします．


CC BY-SA 3.0
2017-07-18T17:18:35.943
36480
2017-07-18T19:48:11.067
24477
question
c
C言語のprintfのline bufferについて


`return 0;` が `main`関数で呼ばれて終了する場合は、

> 5.1.2.2.3 Program termination  
>  1 If the return type of the main function is a type compatible with int,
> **a return from the initial call to the main function is equivalent to
> calling the exit function with the value returned by the main function as
> its argument;11) reaching the } that terminates the main function returns a
> value of 0**. If the return type is not compatible with int, the termination
> status returned to the host environment is unspecified.

(太字にした部分)`exit`関数が呼ばれたのと同じ(main関数の最後に達した場合は`return 0;`があるとする）です。

> 7.22.4.4 The exit function p4  
>  ... all open streams with unwritten buffered data are flushed, all open
> streams are closed,...

`exit`関数が呼ばれると全てのまだ書き出されてないバッファされたストリーム（ファイル）がフラッシュ（書き出されて）全てのストリームがクローズされます。

というわけで、`main`での`return
0`の実行や（それ以外の場所でも）`exit(0)`のような関数を呼び出すと、バッファフラッシュされて書き出されます。

その他の部分では、バッファが書き出されるタイミングは実装依存です。  
例えば、バッファが一杯になったとかバッファの半分に達したなどのタイミングで（あくまで例）書き出されることになるかと思います。

参照：[Ｃ１１ドラフト](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)


CC BY-SA 3.0
2017-07-18T19:48:11.067
36481
2017-07-18T19:48:11.067
5044
36480
answer