• ベストアンサー

C言語の仕組み

C言語の仕組み printfという命令で画面に文字を表示できますが、文字が表示される画面はMS-DOSの画面や開発プログラムの実行ウィンドウの中ですよね。 もしC言語がPCに直接命令できるのであれば、画面全体が真っ暗になって、そこに文字が表示されるべきなのではないかと思いました(つまり、OS上で動くべきではない)。 しかし、仮に全く最初から文字を打つとしたら、ディスプレイの仕組みを理解して、ドットで文字を表示させなければなりません。 いったいprintfというのはどこに対して命令しているものなのでしょうか

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

誤解があるようですが、printf関数は『画面には出力していません』 正確には「標準出力」と呼ばれる出力装置へ文字列を出力する関数です。 その「標準出力」が、DOS窓だったり実行ウィンドウだったりするので、それぞれの画面に出力しているように見えるだけです。 リダイレクト機能を使って 「コマンド > file.txt」とすれば「標準出力」は file.txtというファイルになるし パイプ機能を使って「コマンドA | コマンドB」とすれば、コマンドAの標準出力先はコマンドBの「標準入力」になります。 これらの動作はOSを通して行うものです。 >OS上で動くべきではない というのは大きな考え違いです。 ついでに言えば、scanfやgetc等もキーボードからではなく「標準入力」から入力する関数です。 以上は、Cの標準ライブラリの「標準入出力関数」を使った場合の話。 自前で「直接画面に出力するprintf関数」を作成した場合はこの限りではありません。 printfはあくまで「標準ライブラリに含まれる関数」であって、「C言語」の一部ではないのです。

lu-mu-
質問者

お礼

標準関数ってそういうことだったんですね。 C言語の最も根元にある関数というふうに捉えていましたが、全然違うんですね。 ありがとうございました。

その他の回答 (6)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.7

自分でprintfを実装するか、せめて既存のprintfのソースコードを読むのが理解への一番の近道です。

lu-mu-
質問者

お礼

なるほど。どうやってやるのか調べてみます

  • BuriBuri4
  • ベストアンサー率28% (150/525)
回答No.6

printf( )は《標準出力(stdout)》に出力を行う関数であり《画面》に出力する関数ではありません。 stdoutは通常はデバイスではなくOSが管理するストリームです。 標準出力(stdout)はプログラム実行時にOSが割り当てます。 例えば test.exeを実行する際に test.exe > wotk.txt とすれば printf( )の出力先は画面ではなくwork.txtファイルになります。 OSを持たない小規模な組み込み系システムの場合はprintf( )自体がデバイスへの出力として実装されている事もあります。

lu-mu-
質問者

お礼

ありがとうございました

  • gungnir7
  • ベストアンサー率43% (1124/2579)
回答No.5

どの言語もそうですが、OS上で動くにはOSにコマンドを認識させる必要があります。 それがネイティブのコードかインタプリタを介するかで大きく2つに分かれます。 C言語は前者、JAVAや.Net Basicなどは後者になります。 C言語の場合はソースをCコンパイラがネイティブな機械語に変換します。 コンパイラがOSに理解できるように変換してくれます。 ディスプレイの仕組みを理解して・・・という部分もコンパイラが担当します。

lu-mu-
質問者

お礼

ありがとうございました。

  • notnot
  • ベストアンサー率47% (4900/10359)
回答No.4

入門書に載っていたり、学校で習ったりするCは、「OSの上で動くC」です。 Windows上で動くCならprintf関数は最終的にWindowsの文字出力APIを呼び出します。 「OSの上で動かないC」もあります。「スタンドアローン環境」とか呼ばれる。printfとかは使えず、ハードウェアを直接制御することになります。

lu-mu-
質問者

お礼

ありがとうございました。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

実際のコンパイラ自体の実装によります。 Windows用の例えばVC++であればprintf関数ライブラリがWindowsAPIを使ってコンソールに文字を出力する処理を行っています。 Linuxで動いているgccとかであれば、printf関数ライブラリはLinuxのAPIに対してコンソール出力をするためのコードが書かれています。 マイコン等だと、printfがRS232cに出力するprintf関数ライブラリがあるかと思えば、printfがちゃんと実装されていない(使えない)コンパイラもあるわけです。 printf関数もC言語で書かれたプログラムに過ぎません。なので、環境に依存した部分は、それ専用の処理が書かれていると思ってもらって良いと思います。 >しかし、仮に全く最初から文字を打つとしたら、ディスプレイの仕組みを理解して、ドットで文字を表示させなければなりません。 もし、その環境専用なのであれば専用のライブラリが提供されることになります。

lu-mu-
質問者

お礼

ありがとうございました。

  • x1va
  • ベストアンサー率26% (802/3006)
回答No.1

> いったいprintfというのはどこに対して命令しているものなのでしょうか OSに対して行います。 > 仮に全く最初から文字を打つとしたら、ディスプレイの仕組みを理解して、ドットで文字を表示させなければなりません。 コンパイルの際に、OSがもつ機能を呼び出してそれを実現するようにしているのです。 OSの役割の一つが、ある程度の基本機能を提供しておいて、ユーザプログラムはそれを利用するだけで作れるようにしておくことにあります。

lu-mu-
質問者

お礼

ありがとうございました

関連するQ&A

専門家に質問してみよう