C言語のヴァージョン C99 C11 ヘッダファイル<stdio.h>、標準入出力とは何のことでしょうか? 



C言語のヴァージョン C99 C11 ヘッダファイル<stdio.h>、標準入出力とは何のことでしょうか? 



1999年(ISO/IEC 9899:1999)には、主として複素数や数学上の演算に関する関数群が大幅に追加された。2011年(ISO/IEC 9899:2011)には、アライメント・マルチスレッド・Unicode・メモリ境界チェック付き関数などが追加になった。


ソーラー 「このウィキペディアの記事をみて気付いたんですが


C言語にはversionがあるようです。


ときたま C99やC11という記述が


いろんな場面ででてくるのには気付いていました。


どうやらC99というのは1999年に改定が加えられたversionで


C11は2011年に改定されたversionのようです。」


アレサ 「0010100・・・ ということは数字の大きいC99の方が


C11より古いversionになるんですね。」


以下ウィキペディアより


C11 (ISO/IEC 9899:2011) では、標準ヘッダとして以下のものを定めている。

assert.h 診断機能

complex.h 複素数計算 (C99より追加)

ctype.h 文字操作

errno.h エラー

fenv.h 浮動小数点環境 (C99より追加)

float.h 浮動小数点型の特性



ソーラー 「おおっここっここ


さっきfloatの数値格納範囲を調べるとき


ヘッダファィル<float.h>を


プログラムの冒頭で記述しました。


#include <float.h>みたいな感じで・・・」


アレサ 「 000011・/ <float.h>は標準Cライブラリの中の一つの


ヘッダファイルだったんですね 0001111・・・」


ソーラー「つづきはっと・・」

inttypes.h 整数型の書式の変換 (C99より追加)

iso646.h 代替つづり(Alternate spellings) (ISO/IEC 9899/AMD1:1995 より追加)

limits.h 整数型の大きさ

locale.h 文化圏固有操作

math.h 数学

setjmp.h 非局所分岐

signal.h シグナル操作

stdalign.h アライメント (C11より追加)

stdarg.h 可変個数の実引数

stdatomic.h アトミック操作 (C11より追加)

stdbool.h 論理型および論理値 (C99より追加)

stddef.h 共通の定義

stdint.h 整数型 (C99より追加)

stdio.h 入出力

ソーラー 「でたっでた


                   stdio.h


                                     」


ソーラー 「stdio.h これも標準Cライブラリの中の一つの


ヘッダファイルだったんだね。しかも 入出力機能をつかさどっている。


いやあ 僕は標準Cライブラリ=(イコール)<stdio.h>と勘違いしてたなあ。


だってプログラムを記述するとき必ずプログラムの先頭に


#include <stdio.h>とかいてあるから 


この <stdio.h>の中にprintf関数の定義や


(printf関数の定義ははいっています。)


他の


すべてのいろんな便利機能が全部はいってるとおもってたんだ。


<stdio.h>ってスタジオ.h


つまり


プログラムを製作するスタジオ機能


をもっているので


プログラムの冒頭に記述するんだと思ってたし・・・。」


アレサ 「そうですね。<stdio.h>ってスタジオ.hではなく


stdio⇨standard input and output


”スタンダード インプットアンドアウトプット”


"標準入出力"


というのが本来の名前だったみたいですね。


ここで ちょこっとだけ補足してみます。


"標準入出力"の標準とは何のことかな?


と思われる方も多いとおもいます。


標準とは


コンピュータのメモリからデータをディスプレイ画面に出力したり


ディスプレイ画面に打ち込まれたデータを


コンピュータのメモリに格納する


つまり


ディスプレイ画面にデータが入出力されるときが標準というわけです


では


標準でない入出力とは


何のことでしょうか


ディスプレイ画面を介さない入出力は全て標準でない入出力となります。


たとえば


赤外線センサーから温度情報をコンピュータのメモリにうけとるのは


標準でない入力


ロボットなどの機械にコンピュータのメモリ内のデータを送り込む


のは


標準でない出力となります。


そして

コマンドプロンプト画面に

標準出力をおこなうのがprintf関数であり


コマンドプロンプト画面から

標準入力をおこなうのがscanf関数となっています。

(scanf関数はのちほどでてきます。)


つまり<stdio.h>には


printf関数とscanf関数の定義が保存されており


インクルード<stdio.h>


#include <stdio.h>


をおこなわなければ


printf関数とscanf関数が


プログラムで使用できないのです。」



ソーラー

「stdio.h 入出力・・・それにしても入出力の機能とは・・・


これ、このヘッダファイルがなければ何もできないんじゃない?


めちゃくちゃ基本的なんじゃない?」


満足した様子で 紅茶を おいしそうに飲むソーラー。


ソーラー 「そういえば こんなことがよくおこるね


include <stdio. h> をプログラムの先頭に書き込むのを忘れて


printf関数を使用して


プログラムを作製し


そのプログラムを


コンパイルすると


'solarplexus.exe'は内部コマンドまたは外部コマンド、


操作可能なプログラムまたはパッチ ファイルとして認識されていません。


と表示されます


ヘッダファイル<stdio. h>をインクルードしていないと


printf関数を使用することはできないので


エラー文が表示されることになるんだね」




紅茶を おかわりする。


ソーラー 「ところで



            もし


<stdio. h>が標準入出力の基本的な機能を


もっているなら


プログラムにヘッダファイル<stdio. h>をかかなければ


何のデータも標準入出力できない



つまり

printf関数 scanf関数(のちに登場します)


を使えないので


printf関数をつかうと


コンパイルエラーが表示されるということなんだけど・・・


そ・こ・で


ヘッダファイル<stdio. h>をかかずに・・・


でも


「他のヘッダファイルは記述して」コンパイルできるかどうか


試してみよ~っと!



printf関数を使いたいのに


他のヘッダファイルだけが記述してあっても


コンパイルできないはず・・・なんだけど・・・


ここでは おなじみのヘッダファイル<float.h>をつかってみましょう。


#include <float.h>

//👆ヘッダファイル<stdio.h>をインクルードしていません

int main()

{

printf("FLT_MIN = %e, FLT_MAX =%e\n", FLT_MIN, FLT_MAX);


return 0;

}


このプログラムを実行すると


プログラムの実行結果


FLT_MIN = 1.175494e-038, FLT_MAX = 3.402823e+038


と標示されます


にゃおん ははははは  いいね


ヘッダファイル<stdio. h>は標準入出力機能を管理している割には


ヘッダファイル<stdio. h>をつかわなくても


なぜか


printfが用いられている


プログラムを


実行できて


コマンドプロンプト画面にデータも出力表示もできてるね。


やったね!


この<stdio. h>の標準入出力機能って


いったいどういう仕組みになっているのかな???」



アレサ 

「01001011001 そうですね・・・・・楽しい項目ですね。


ところで


プログラムが実行されるとき


機械語に翻訳された命令が


コンピュータに


与えられます


コンピュータに命令が入力されるというわけですが


このことは


この<stdio.h>とは関係ありません


<stdio.h>の標準入出力機能って


プログラムを打ち込んで


コンピュータ内に情報をおくりこんだり


コンピュータ外に情報を送り出す超基本的な機能ではなく


ただ単に


printf(ディスプレイ画面に標準出力機能)と


scanf(ディスプレイ画面に標準入力機能)に関する、つかえるようにする機能なのですね


000011111」


ソーラー 「そうだね


たしかに いっつも


#include <stdio.h>と


printf(出力機能)関数は


セットでかかれてる・・・


アレサのいうとおり


<stdio.h>に格納されている機能とは


自分の望みの文字を


printf(出力機能)関数や


scanf(入力機能)をつかって入出力できる機能なんだね


だから


#include <stdio.h>とソースコードにかかなければ


printf(出力機能)関数も


scanf(入力機能)関数もつかえない。


<stdio.h>はそのための機能で


コンパイルされたプログラムをコンピューター内に


入力、


コンピューター内もデータを


出力することとは関係ない機能なんですね 


それにしても


#include <stdio.h>とソースコードにかかなければ


printf(出力機能)関数がつかえないのなら


さきほどの#include <stdio.h>を


先頭に書いていないプログラム


#include <float.h>


int main()

{

printf("FLT_MIN = %e, FLT_MAX =%e\n", FLT_MIN, FLT_MAX);


return 0;

}


において printfがつかえているのはなんで???ってなりますね



ところでエディタに文字を書き込む(入力する)


機能も<stdio.h>と全く関係ありません。


まったく別のシステムによってエディタに文字は


入力されています。


<stdio.h>はとりあえず、コンパイル


したあとでないと機能できません。


つまり


エディタ上で


#include <stdio.h>とかかれただけでは


何も実行されないということです


コンパイルしてプログラムが実行されて初めて


ヘッダファイル<stdio.h>に格納されたプログラムが使用されるというわけです


ですから


エディタに文字を書き込む(入力する)


機能は<stdio.h>と全く関係ありません



へへ ここらあたりの仕組みにかんしても


いろんなところを理解していくうちにもっと理解できるようになるんだね


楽しみだね。」


アレサ 「0000111000 はい、そのとおりです。000000」




以下 ウィキペディアより


stdlib.h 一般ユーティリティ

stdnoreturn.h _Noreturn (C11より追加)

string.h 文字列操作

tgmath.h 型総称数学関数(Type-generic math) (C99より追加)

threads.h マルチスレッド (C11より追加)

time.h 日付及び時間

uchar.h Unicodeユーティリティ (C11より追加)

wchar.h 多バイトおよびワイド文字拡張ユーティリティ (ISO/IEC 9899/AMD1:1995 より追加)

wctype.h ワイド文字種分類およびワイド文字大文字小文字変換ユーティリティ (ISO/IEC 9899/AMD1:1995 より追加)


アレサ 「ソーラーさん みてください。stdlib.h 」


ソーラー 「あっ標準Cライブラリの中にあったんだ・・・


stdlib.h


気になってたんだ・・・


どう発音するんだろ?


stdlib.h  スタリブ   スペアリブ


名前 面白そうなんだ・・・


それに


string.h


string ギターの弦のようで


かっこいいヘッダファイルだと思ってたんだ。」


アレサ 「わたしも、C言語で使われている単語の中には


かっこいい名前のものがあるとよく思います。」





🍰おまけ


ヘッダファイル


stdlib.h



stdlibはstandardlibrary


の略で


インクルードすると


rand(乱数すなわちランダムな値を生成することができます)

srand

atoi

malloc

realloc

calloc

free


などの関数を使うことができるようになります




  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る