ANSI 規格
C++ 上で開発するには、2つの要素に分けることが出来ます。
- 他人が作った program 部品を使う
- program 部品を作る
これらを巧みに使い分け、効率や能率を上げます。
後者の program 部品を作るのは、 program をする事が目的なので、理解できると思います。
さて、前者はどうでしょう。
他人の program の部品を扱うという事は手抜きにも、一見とれます。
しかし、他人の部品を扱う事は入門にもなります。
Beginner から経験を積んだ頃、自らの判断で様々な適切な判断をすればいいことです。
他人様の program 部品を扱う場合、規格化されたものがあります。
規格化されたものは、言い換えれば、その規格に準拠した compiler の全て開発が可能です。
これは便利です。様々なOSなどで、規格の部品を扱えば program 開発が出来てしまうんです。
そこで ANSI 規格を扱います。
ISO と ANSI が C++ 標準規格を採択しており、多くの C++ compiler で準拠が謳われています。
(ISO:International Organization for Standardization, ANSI:American National Standards Institute)
もし、これから C++ compiler を購入されるのでしたら、ANSI 規格 C++ に準拠しているかどうかを確認してください。
また、academy や会社の環境上で既に扱う compiler が決まっている方は、管理者に install されている compiler が ANSI 規格 C++ に準拠しているかどうか確認してください。
残念ですが、ANSI 規格 C++ に準拠を謳っていない compiler は、あまり良いとはいえません。
準拠を謳っている compiler への変更を提案します。
iostream cout
iostream には cout や cerr や cin などがありますが、標準出力に使うのが cout です。
標準出力とは標準で出力する先で、display装置に表示します。
文字や数字などを画面に表示できると考えてください。
まず、単体の C++ に iostream 機能を追加する必要があります。
単体の C++
|
← [機能の追加作業] →
|
"iostream" program 部品
|
教える方法は #include に < > で iostream.h を囲みます。
#include <iostream.h>
|
iostream.h は file 名です。拡張子は .h です。
通常この .h file を header file といいます。
この #include は使う前に記述しなければなりません。
なので、通常は一番上に記述します。
つまり header file には、C++ compiler に program 部品を教えることができます。
この include には namespace などの問題があるのですが、とりあえずはこのままでいきます。
もう少し詳細まで話をします。
#include は、pre-processorにて処理されます。
この文の記述してある場所に、その file (の内容)を貼り付けることをしてくれます。
つまり pre-processor は compile する際に様々な program の管理をしやすくしてくれるのです。
#include < iostream.h > ということは iostream.h の内容をその記述してある文の位置に挿入するって意味です。
何故こんなことをするのか?
それは簡単に iostream の program 部品を扱えるような工夫です。
program は部品を扱うのに宣言やら定義やらが必要になります。
つまり、かなり時間が掛かることになります。
program が複雑化し、様々な program 部品を扱うとそれを compiler に教える記述だけで大量の記述が必要になります。
これは大きな規格である ANSI 規格にもいえる事です。
膨大な規格の program 部品を扱うのに、compiler に教えるために大量の記述をしていては、main の program は一向に進みません。
よって、compiler に教える記述を header file としておけば black box 化し、この一行で扱えるようになります。
つまり、その仕事を pre-processor に任せて programmer は自分の仕事に時間を使う事が出来るのです。
iostream とは I/O STREAM であり、その名の通り Input/Output の stream 群です。
簡単にいってしまえば、computer への入出力関連だと把握してもらえれば結構です。
#include には " " で header file を囲んでいる場合があります。
これは自作の program 部品を利用する場合などに用います。
大抵の場合、規格の header file は環境設定によって path を決められています。
この決められた path 内にある header file は < > で囲みます。
それとは異なり、例えば自作の program 部品などの header file を作った場合は " " で囲みます。
" " で囲む場合は header file を current path に置いて扱います。
cout
これで iostream の使用を compiler に教える事が出来たので、実際に cout を使ってみます。
扱いの書式は実に簡単です。
#include <iostream.h>
int main()
{
cout << "Language C++" ;
return 0 ;
}
|
この実行結果です。
Language C++Press any key to continue
|
ん? Press any key to continue という文字を表示するようにしたおぼえはありません。
実は、この Press any key to continue という文字は Visual C++ IDE 上で表示されるもので program には関係ありません。
実際には program が終了し window を closed するんですが、この程度の program ですと 一瞬で表示を終え window を閉じてしまうんです。
そこで、program が終了したときに Visual C++ IDE 上では suspend 状態になり、読んで字の如く何かkeyを押すまでfreezeしててくれます。
正確に program として機能している部分は
です。
例えば MS-DOS や Human68k などの OS で A:> から実行した場合は
となります。また linuxなどのshell で prompt 表示がされており ~/ から実行した場合は
になっていると思います。
実際に cout を記述しているのは program のある一行です。
cout << "Language C++" ;
|
cout は << に文字を " " で囲んだ文字を表示します。
では文字を変えて見ましょう。
と変更します。ですから全体では
#include <iostream.h>
int main()
{
cout << "1 + 1 =" ;
return 0 ;
}
|
のようになります。この実行結果です。
やはり " " 内に書いた文字はそのまま表示されます。
では、今度は cout の記述を
と変更します。"(double-quotation)と =(equal)が削除されている事に気をつけてください。
全体では
#include <iostream.h>
int main()
{
cout << 1 + 1 ;
return 0 ;
}
|
のようになります。実行結果です。
実に計算できました。ここで、実行した人は唐突に 2 という数値だけを見ることになります。
programmer は自分で 1 + 1 と記述していますが、どうせなら式も表示したいものです。
#include <iostream.h>
int main()
{
cout << "1 + 1 = " << 1 + 1 ;
return 0 ;
}
|
この実行結果です。
できました。このように cout は分割して表示を出来ます。
ですから同様の出力を表示する program でも次のように variation が出来ます。
#include <iostream.h>
int main()
{
cout << "1" << " + " << "1" << " = " << 1 + 1 ;
return 0 ;
}
|
#include <iostream.h>
int main()
{
cout << 1 << " + " << 1 << " = " << 1 + 1 ;
return 0 ;
}
|
計算を computer にさせなくてもいいという範囲を含めば
#include <iostream.h>
int main()
{
cout << "1 + 1 = 2" ;
return 0 ;
}
|
これでも結果(出力)は同じです。
しかし、これでは曖昧でいまいち " " で囲む場合と囲まない場合の用途が鮮明になりません。
これは computer の世界の一般的な仕様で data 型やliteralという考え方になります。
詳しくは「変数」の関係の項目を参照してください。
Manipulator hex, oct, dec
さて、もう少し cout について説明します。
cout では 十進数、八進数、十六進数の表記が簡単に出来ます。
次の sample を見てみましょう。
#include <iostream.h>
int main()
{
// 十六進数表記
cout << hex << 100 << "," ;
// 十進数表記
cout << dec << 100 << "," ;
// 八進数表記
cout << oct << 100 ;
return 0 ;
}
|
この実行結果です。
100という十進数表記の値(大きさ)をそれぞれ十六進数、十進数、八進数で表記しています。
しかし、この変換には気をつけなければならない事があります。
#include <iostream.h>
int main()
{
// 十六進数で 50 を表示
cout << hex << 50 << "," ;
/*
:
:
大量の記述
:
:
*/
// 5 + 5 だから 10 と表示させたい
cout << 5 + 5 ;
return 0 ;
}
|
こんな感じで program を組んだとします。
一見問題ないように思うかもしれません。
この実行結果です。
10 と表示したいのに a になっています。
一度 cout に hex を指定すると、それを維持してしまいます。
ですから、使い終わった後には戻しておくのがよいかもしれません。
#include <iostream.h>
int main()
{
// 十六進数で 50 を表示
cout << hex << 50 << "," << dec ;
/* 大量の記述 */
// 5 + 5 だから 10 と表示させたい
cout << 5 + 5 ;
return 0 ;
}
|
この実行結果は
十進数で 10 と表示されています。
program で大切なのは、いかに通常的に管理できるかという要素があります。
もし、hex のまま programming した場合、programmer は hex にした事を記憶していなければなりません。
つまり、こういう自分での特別なruleを大量に作ってしまえば、それだけ careless mistake を起こし易くなります。
program は単純な mistake でも容易に発見できない事も多々出てきます。
その上で、こういった mistake を防ぐ事は、大変有効な事なのです。
Manipulator endl
これは実に便利な manipulator です。
cout stream を使って endl manipulator を使う人は、多数いると思います。
これは改行をする manipulator です。
#include <iostream.h>
int main()
{
// 十六進数表記
cout << hex << "十六進数表記 : " << 100 << endl ;
// 八進数表記
cout << oct << " 八進数表記 : " << 100 << endl ;
// 標準に戻しておく
cout << dec ;
// 十進数表記(標準)
cout << 25 + 25 + 50 << endl ;
return 0 ;
}
|
この実行結果です。
十六進数表記 : 64
八進数表記 : 144
100
|
[EOF]