C言語の基礎
C言語の仕組
C言語を作成してプログラムを実行するために、重要な点がいくつか存在します
あらゆるCプログラムには関数(function)がひとつ以上あるということです
関数の中には命令(statement)が詰め込まれています
関数とは、いろんなプログラムの流れがひとつのまとまりとして登録されているものです
関数は情報を受け渡ししながら、指定されたプログラムを実行します
たとえばお店屋のレジを考えましょう。レジのバイトさんが関数と考えます
関数を呼び出すのはお客さんです。お客が来てはじめてレジを打つという関数が働きます
このときお客は関数に情報を渡します。この情報はひとつとは限らず複数あります
この場合は「商品」と「お金」ですね。この情報のことを引数といいます
レジのバイトは商品が指定する金額に、渡されたお金が等しいかどうか確認します
渡された金額が商品の指定金額と等しければ「商品だけ」を返します
商品の指定金額よりも多く金額を受け取れば、「商品とオツリ」を返します
商品の指定金額よりも渡されたお金が低ければ、警告を出します(商品は渡されずお金をそのまま返されます)
このように、レジのバイトさんが戻す値、つまり関数が呼び出し元に返す値を戻り値といいます
もちろん関数の内容を記述するのもプログラマの役目です
関数を作成するには、先ほど説明した引数や戻り値の指定と関数名を指定します
名前が無ければ呼び出すときに困りますよね
そして関数は { } で囲まれた命令文(以後、ステートメント(statement)と呼びます)で構成されます
戻り値の型 関数名(引数リスト)
{
命令文;
}
このように、関数などを作成することを定義するといいます
定義だけではまだ使われません。呼び出されてはじめて関数は動きます
関数の詳しい説明は、関数の章でゆっくり説明するとして、この場では画面に文字を出す方法を勉強しましょう
では、C言語のプログラムはどこから始まるのでしょう?
基本的にプログラムは上から下へ流れていきます
しかし、C言語が実際に実行されるのはmain()関数からというお約束があります
画面に文字を出力するステートメントは存在しません。画面に文字を出すには関数を使います
ここもC言語プログラムの注目すべきところで標準ライブラリというのが ANSI C 標準 では実装されています
Cプログラマはライブラリで実装されている便利な関数群をプログラムの中で自由に使うことができます
つまり、自分で作ると非常にめんどくさい関数が最初から多くサポートされているのです
当然、画面に文字を表示させたりキーボードから入力させたりといった関数も最初から用意されています
標準ライブラリには数多くの種類がありますが、入出力や文字列操作、数学関数などをサポートしてくれます
その中でもこれから私たちが全てのプログラムで必ず使うであろうライブラリが stdio.h ヘッダファイルです
全ての標準ライブラリは .h という拡張子でヘッダファイルといいます
ライブラリ関数をプログラムの中で使うには、そのプログラムの先頭にヘッダファイルを挿入する必要があります
#include <stdio.h>
ソースファイルの中に別のライブラリファイルを挿入することをインクルードするといいます
上の #include という命令は stdio.h をインクルードしています
これも後ほど詳しくやりますが、#ではじまる命令をプリプロセッサ命令
(または プリプロセッサディレクティブpreprocessor directive )といいます
これはC言語のステートメントではなくて、Cコンパイラに指示をするための命令です
さて、これまでのことを一度まとめましょう
- C言語はmain()関数ではじまる
- C言語の標準関数はヘッダファイルに記述されている
- ヘッダファイルをインクルードするにはプリプロセッサ命令 #include をソースの先頭で使う
このことを頭に入れて、以下のサンプルプログラムを(やっと…)書いて下さい
ただしC言語は大文字と小文字を区別するので注意してください
#include <stdio.h>
main()
{
printf("こんにちは、ご主人様…");
}
これをテキストエディタで書きます。必ずファイルの拡張子を.cにしてください
次にお手元のコンパイラでコンパイルして実行してください
エラーが無ければexe実行ファイルが生成されるはずです
さてmain()関数は、とりあえずこの場では何も引数を受け取らず、何も値を返さないことにしましょう
正確には、プログラムが正常終了したら 0 をOSに返しますがこの場は省略します
一部の処理系では警告を出します (警告 W8070 test.c 6: 関数は値を返すべき(関数 main ))
ですが、今の目的はとりあえず画面に文字を表示させることなので気にしないで下さい
お約束どおり、ソースファイルの先頭でプリプロセッサ命令 #include でstdio.hヘッダファイルをインクルードしています
stdio.hにはprintf()関数などの入出力関数が定義されています
このプログラムで使っているprintf()関数は引数を標準出力に渡します
標準出力とは、基本的に画面のことを指します。それ以外もありますが、この場では標準出力とはディスプレイだと思っても良いです
printf(" ") のカッコ() の中に引数を渡します
もっとも単純なprintfの形が上のプログラムのような printf("出力したい文字列"); というものです
ところでprintf()関数の最後にセミコロン 「 ; 」が付いています
これもC言語のお約束ですがステートメントの終わりはセミコロンが必ず付きます
セミコロンを付け忘れるとエラーが出るので、慣れないうちはありがちなミスですので気をつけてください
より複雑な表現
基本的なC言語の書き方は理解できたと思います(わからないことがあれば、遠慮なくBBSにでも書いてください)
では、より複雑な文字列の表現力を身につけながらprintf()関数の構造をもっと知りましょう
先ほどのプログラムで疑問に思った方もいるかもしれませんが、空白やタブの扱いはどうなのでしょう
たとえば下のプログラムを見てください
#include <stdio.h>
main() {
printf("kitty on your lap"
);
}
これでも問題なくコンパイル可能です
C言語は、基本的に空白や改行は無視されます。ただしステートメントの途中や文字列の途中に改行を入れてはいけません
prin
tf("string");
この場合はエラーが出ます。もちろん prin tf() のようにステートメントの名前に空白を入れるのも禁止です
なにより、いくら改行や空白が例外を除いて自由とはいえ、見ずらいソースは嫌われます
現代のプログラムの重視される技術として、プログラムソースの可読性が問われます
とくに共同開発者などになるのなら、ソースの見やすさ、読みやすさについても常に研究してください
さらに、printf()関数はもちろんmain()関数の中で何度でも使用できます
あまりにも長い文字列を表現する場合は、2行に渡って記述するのもひとつですね
#include <stdio.h>
main()
{
printf("ぬぅ、よりによってジョースターの末えいが");
printf("このC言語の世界に入門してくるとはぁぁ");
}
たらたらと一行に長く書くよりも、ずっと見やすくなりますね
ん?、でも改行したい場合はどうすればよいのでしょうか
改行だけではありません、文字列の中でダブルクォーテーションを使いたいときや、タブを使いたいときは…
そのような特殊な文字列表現にはエスケープシーケンスという特殊文字を使います
エスケープシーケンスは円マーク \ を使った特殊文字で、とくに改行コード\nは多くの言語で採用されています
エスケープシーケンスには以下のようなものがあります
記号 | 意味
|
---|
\a | ベル文字(アラート)
|
\b | 1文字分戻る
|
\f | ページ送り(クリア)
|
\n | 改行、復帰
|
\r | 同じ行の先頭に戻る
|
\t | 水平タブ
|
\v | 垂直タブ
|
\\ | \を表示
|
\? | ?を表示
|
\' | シングルクォーテーション(')を表示
|
\" | ダブルクォーテーション(")を表示
|
\0 | ヌル
|
\N | 8進定数(Nは8進数の定数)
|
\xN | 16進定数(Nは16進数の定数)
|
これを使えば、DOS画面でもより高度な文字列表現が可能です
#include <stdio.h>
main()
{
printf("ぬぅ、よりによってジョースターの末えいが\n");
printf("\tこのC言語の世界に入門してくるとはぁぁ");
}
実行結果は次のようになりました
ぬぅ、よりによってジョースターの末えいが
このC言語の世界に入門してくるとはぁぁ
とくに改行コード\nは多用するので、覚えてください
それ以外のものは、時と場合によって使い分けるといった感じでしょうか…
コメント
長いプログラムを書くと、当然作業は数日、下手もすれば数年かかります
そのようなことになると、後半で最初のほうに書いた部分が何をしているのかわかりずらくなります
以前書いたソースコードが何をしているのか、すっかり忘れたりしてしまうと大変ですね
そこで、プログラムの実行とは何の関係もないコメントをソース上に記しておくことができます
C言語のコメントは/*で始まり*/で終わります
#include <stdio.h>
int main()
{
/*コメントなので、プログラムには何の影響もありません*/
/*変数が何に使われているか等、後の拡張時のことを考えてコメントを残します
コメントはもちろん何行あってもかまいません*/
return 0;
}
他にも単一行コメントといって//というコメントがあります
これは // 以降、その行がコメントになります
しかしこれはC++のコメントなので、C言語のコメントではありません
最近のコンパイラであれば、ほとんどが//にも対応しているようですがANSI C 標準ではないので推奨できません
#include <stdio.h>
int main()
{
//ひざの上の同居人
// 〜kitty on your lap〜
return 0;
}
1.#include <file-name>
2.#include "file-name"
プリプロセッサディレクティブです
ソースプログラムの記述された位置に、指定ヘッダファイルをインクルード(挿入)します
通常の標準ライブラリには1番の書式を、そのプロジェクト特有のヘッダファイルには2番の書式を使います(一般論)
file-nameには、インクルードするヘッダファイルを指定します
int printf(const char *format[,argument, ...]);
【ヘッダ】stdio.h
【戻り値】成功時は出力バイト数、エラー時はEOF
書式付データを標準出力に渡します
formatには出力する時の書式(type参照)を指定します
argumentはオプションの引数です。省略可
type
c , C | 1個の文字
|
d | 符号付10進数整数
|
u | 符号なし10進数整数
|
i | 符号付8進数整数
|
o | 符号なし8進数整数
|
x , X | 符号なし16進整数、"a〜f"は X を指定すると大文字で出力
|
s , S | NULL文字まで文字列を出力
|
e , E | 符号付[-]d.dddd e [+/-]ddd形式の値
|
f | 符号付[-]dddd.dddd形式の値
|
g , G | e,fの書式のうち指定された制度を表現できる短い方の書式
|
printf()関数の引数の詳細は後記します