2013年10月27日日曜日

C/C++ Hello Worldと文法

C/C++の準備が終わった所で、Hello Worldを作ります。Hello Worldは一番最初に作るプログラムとしては有名で、単に Hello World と表示するだけのものです。
以下の様に入力します。

最初にhelloというディレクトリを作ってそのディレクトリに移動しています。
vimでhello.cでソースコードを書いて保存します。

hello.cの中身は以下のように書きました。


一番したの:wqは保存して終了です。
それで、gccというコマンドによって、hello.cをプログラムに変更します。この変更作業をコンパイルといい、gccのようなソフトウェアをコンパイラと言います(厳密には少し違いますが)。

プログラムの名前は、Windowsの場合、a.exeという名前になります。 Linuxの場合は、a.outという名前になります。
 ./a.exeと入力しEnterキーを押すとa.exeという名前のプログラムが実行され、 ソースコードに書いた文字が表示されます。

またhello.c内でLinuxの場合は、円マーク(¥)を記述した部分はバックスラッシュ(\)と表示されるかもしれません。

最後のlsコマンドで、a.exeとhello.cのファイルがあることが確認できると思います。

hello.cの文法について説明します。文法とはどのように記述をするか、と言うことです。この文法に従ってソースコードを書かないとgccを行ったときにエラーとなります。

#include <stdio.h>

最初に#から始まっている行は(青字で見難いですが)、C/C++言語では特殊な行でマクロと呼ばれています。先ほど、gccコマンドで実行ファイルを作成しましたが、実際には、gccコマンドでは以下が行われています。

プリプロセス → コンパイル → リンク

#で始まる行はプリプロセスによって、処理され文法もC言語本体とは異なります。
includeは意味がある単語で、分割できません。 例えば下記のようにincとludeの間にスペースを入れます。

#inc lude <stdio.h>

すると、下記のようにエラーが表示されます。エラーが表示された場合、プログラムは作成されないので、ソースコードを修正して再度コンパイルを行う必要があります。




マクロの文法を意味のある単語に分割すると以下のようになります。

単語 説明
# マクロであることを示します。
include 指定した機能を使用する事を宣言するために使います。実際に行っていることは別のC言語のファイルを取り込むだけです。
<stdio.h> stdio.hと言う名前の機能を使用することを示します。機能はOS(またはコンパイラ)が最初から用意している機能です。
自分で作った機能の場合には"myfunc.h"のように"で括ります。

改行
マクロの終了を意味します。マクロでは改行が意味を持ちます。マクロを終了したくない場合には¥(\)で繋ぎます。例えば以下のようにします。
#include ¥
<stdio.h>

この単語の間には空白文字(スペースキーで入力した文字)をどれだけ入れても問題ないです。

その他がC言語本体となります。「関数」については後述します。
単語 説明
int 次の関数main()の返り値の型を示します。C言語では省略可能で、省略するとintとみなされますが、省略しないことを奨励します。
main mainという名前の関数名で、機能を記述することを示します。
( ここから関数の引数の記述を開始すると言う意味です。
) ここで関数の引数の記述を終了すると言う意味です。
{ ここから関数の中身の記述を開始するという意味です。
printf printfというコンソールに文字列を表示する関数を実行することを意味します。stdio.hに機能が含まれています。
( ここから関数の引数の記述を開始すると言う意味です。
"Hello World¥nGood bye\n" 関数に渡す引数を記述しています。この記述はプログラムの動作とは関係ないデータで、ソースコードに直接記述するデータをリテラルといい、このダブルコーテーション(")で括ったデータは文字列のデータのため、文字列リテラルと言います。
) ここで関数の引数の記述を終了すると言う意味です。
; printfから始まった機能の記述の終了を意味します。
return main関数を次に指定された値で終了することを意味します。
0 返り値を示します。この記述はプログラムの動作とは関係ないデータで、ソースコードに直接記述するデータをリテラルといい、数値だけのデータは数値リテラルと言います。
; returnから始まった機能の記述の終了を意味します。
} ここで関数の中身の記述を終了すると言う意味です。
これらの単語の間には空白類文字(スペース、改行、タブ)をどれだけ入れても問題ないです。マクロは空白のみで、C言語部分は改行やタブもOKです。単語の大文字小文字は区別するのでreturnをReturnなどと記述するとコンパイルできません。

文字列リテラルについてもう少し詳しく話します。リテラル内の¥文字は特殊な意味を持ち、¥nは改行を意味します。円マーク自体を表示したい場合は¥¥と2つ繋げて文字列リテラル内に書くと1つの¥が表示されます。文字列リテラル内で改行は出来ません。長い文字を分割したい場合は、一旦ダブルコーテーション"で終了し、改行してから再度ダブルコーテーション(")で記述します。

以下はNGです。

        printf("Hello World¥n
                Good bye¥n");

以下はOKです。
        printf("Hello World¥n"
              "Good bye¥n");


main()やprintf()は関数と呼び、データを扱って処理を行う機能のひと塊を指定します。関数はデータを受け取り、処理をして、データを返します。

このプログラムではmain()の機能を自分で作って、すでにあるprintf()の機能を使用しています。main()ではデータの受け取りはしていませんが、0を返しています。printf()では、 "Hello World¥nGood bye\n"のデータを受け渡しています。返り値も戻ってきていますが、その返り値に対して何もしていません。

main()は少し特殊な関数でプログラムが実行されると一番最初に呼ばれる関数です。main()関数の返り値はコンソール上で以下の様にechoコマンドで表示することができます。

$ echo $?

文法に関してはとりあえず以上です。最初の頃は機能の終了を示すセミコロン(;)を入力し忘れやすいかもしれません。 色々なところに改行や空白を入れたり、終了を意味する記述を削除したりして、コンパイルを試すと文法について詳しく解ってくると思います。

0 件のコメント:

コメントを投稿