C言語によるプログラミングの基礎

目次

このページでは,C言語によるプログラミングの基礎をまとめています.今後,より高度なプログラムを作成するにあたり,必ず理解しておかなければならないポイントです.しっかり習得しましょう.

ポイント0:おまじない(教科書 p.5)

今後しばらくは,下記のソースコードのうち /** **/ の部分の記述方法について勉強します.その他の部分について理解するには,もう少し勉強が必要となりますので,今度扱うことにします.ひとまず,下記については,決まり文句(おまじない)として,覚えておいて下さい.

 

ポイント1:文(一文ずつ処理,文末には「;(セミコロン)」)(教科書 p. 7)

プログラムは一文ずつ処理されます.C言語のプログラムでは,文(statement)の終わりに「;(セミコロン)」をつけます.日本語で文の最後に「。(句点)」をつけるのと同様に,「;(セミコロン)」をつけることで,一つの文が完結したことを表します.hello.cの場合

とあり,これが一つの分を表しています.

また,「おまじない」の内部で,何か処理を記述する際に「;(セミコロン)」を付け忘れると,エラーとなりますので,注意しましょう.

 

ポイント2:プログラムの処理順

プログラムは上の文から順番に処理されます.例えば,下記のようなプログラム hello2.c を考えます.

これを実行すると,

のあとに

が実行されます.その結果,

のように,順に表示されます.

 

ポイント3:トークン

例えば,英語だと This is a pen. という文を読むときに,

「This」「is」「a」「pen」「.」

に分割して理解すると思います.また,これらは,

「This(主語)」「is(動詞)」「a(冠詞)」「pen(名詞)」「.(文の終わりを表すピリオド)」

のように,それぞれ役割をもっています.

仮に,「This」を「Th」と「is」に分解したとすると,この文を理解できなくなってしまいます.このように,英語を読み書きする際には,文を構成する「品詞」というものを暗に考えています.また,これを知っているからこそ,英語の読み書きができるのです.

C言語のプログラムの読み書きにおいても,文を構成する文字の並びのうち,意味的にこれ以上分割できないものが何か,ということを意識する必要があります.ソースプログラムに記述された文字の並びのうち,これ以上文法的に分割できないものを,トークンといいます.トークンとして,例えば以下のようなものがあります(教科書 p.108, 109):

今回の演習では,「識別子」「文字列リテラル」「区切り子」のみを扱います.

例えば,

をトークンに分割して順に並べると,

になります.また,

です.

ポイント3-1:識別子

変数や関数に与えられた名前(変数や関数については,後ほど扱う予定.)

ポイント3-2:文字列リテラル(教科書 p. 9)

文字の並びを二重引用符(ダブルクオーテーション)「" "」 で囲んだもの.

重要:文字列リテラル内では日本語や全角文字を用いても良いですが,それ以外の場所では用いてはいけません.

ポイント3-3:区切り子

識別子や文字列リテラルなどを区切るために用いられる記号.以下の13種類.

 

ポイント4:関数

printfは関数の一つです (より詳細な資料はこちら

プログラミングにおける関数とは,大雑把に説明すると,

与えられた入力に対し,特定の処理を行い,出力を返すもの

です.

イメージとしては,下図の中央にある「箱」のようなものです.

function

例えば,「与えられた二つの数字の足し算を行う」ことを

function_add

のように表すとします.このとき,中央の箱が「与えられた二つの数字の足し算を行う」関数を表します.この関数(箱)に15と37という数字を,実際に入力すると,

function_add_ex

のような流れで,足し算の結果52が得られます.また,異なる二つの数字を入力すると,それらの和が出力されます.

皆さんは,関数の扱い方として

という二種類のことを学びます.

関数の使い方(よりフォーマルな説明は,教科書p. 6を参照)

関数を使う(実際に入力を与える)際,基本的には

実引数が複数ある場合は,「,(コンマ)」で区切ります.

具体例については,printfに関する説明を参照のこと.

 

ポイント5:改行文字(教科書p. 10, 11)

先ほど,

の表示を行いました.ここでは「hello」と「こんにちは」の間で改行されており,プログラム(抜粋)は,以下のようになっております:

このように,「改行」を表示するためには,改行を表す改行文字「 \n」 を用います.

「\(バックスラッシュ)」と別の文字を組み合わせた特別な表記を,拡張表記といいます.「\(バックスラッシュ)」とそれに続く文字(改行文字の場合はn)の二つを合わせて,一つの文字として扱います.

バックスラッシュ「\」と円マーク「¥」

mac_backslash

win_backslash

 

ポイント6:プログラムにおける空白・改行の扱い(教科書 p. 110)

以下では,プログラムにおける「空白」や「改行」の扱いに関する注意を述べます.hello.cでは以下に示すように,空白や改行を用いています.

hello_space

このような空白や改行があるため,プログラムが読みやすくなっています.

特に,printfやreturn 0 の手前の空白の列をインデント(字下げ)と言います(教科書p. 110).段落を作ってプログラムを読みやすくするテクニックです

しかし,完全に自由に空白や改行を行ってよいのではなく,下記に示すルールを守る必要があります.

文字列リテラル内では日本語や全角文字を用いても良いです.一方,文字列リテラル以外では,原則として,日本語や全角文字を用いてはいけません(コメント内は可).空白についても,全角半角の違いに注意して下さい,

例1)文字リテラル内の日本語・全角文字はOK.

例2)printfの「r」が全角になっている点と,(分かりづらいが,)printfの手前の空白が全角である点で間違い.

トークンは,文法上意味をもつ最小単位です.ですので,トークンを構成する文字の間に空白や改行をいれてはいけません.

例3)識別子であるmainの間に空白がある点(半角空白でも全角空白でも間違い)と,識別子であるprintfの間に改行があるので間違い.

例4)printfの後に空白,printf(の後に改行があるが,OK.

例5)下記のように,空白や改行をできるだけ入れないようにプログラムを記述してもOK(ただし,非常に読みにくい.)

例6)文字列リテラルである”hello\n”内に改行があるので間違い.

これらは,文法上の規則であり,間違えるとコンパイルに失敗します.

コンパイル実行時にエラーが表示された場合は,上記のような間違いがある可能性がありますので,確認・修正の上,もう一度コンパイルして下さい.コンパイルできるようになっていれば,文法上の規則に関する間違いが修正できています.

慣れるまでは,教科書等のソースコードを真似るのが良いと思います.

ポイント7:プログラムを読みやすくする工夫

下記のプログラムは,hello2.c のプログラムに,

という二つの記述を加えたものです.

と表示されます.ここから分かるように

に記載された内容は,プログラムの動作に影響を及ぼしていません.実際,ターミナルには表示されません.

また,文字列リテラルでないにも関わらず全角を用いていますが,コンパイルエラーにはなりません.

この部分を 注釈(コメント)といいます.

注釈は,プログラムの動作に影響を及ぼさないものの,プログラムをエディターなどで開けば読むことができます.これは,以下のような場合に便利です:

具体例 )下記のプログラムについて,printfから始まる行のうち,どれか一行に間違いがあり,コンパイルエラーとなることを知っていると仮定します:

ここで,どの行が間違っているか,手を動かして調べることを考えます. 例えば,二つ目のprintfが怪しいと思った場合,

のようにしてみます.このとき,コンパイルエラーが生じなければ,二つ目のprintfが間違っていたことが分かります.(実際は,そうではないので,二つ目のprintfから始まる行には不備はありません.)

以下,注釈を使うときのポイントについて,具体的に説明します(教科書p. 4-5)

/* */を用いる場合

→エラーが生じる

//を用いる場合