ホーム > すべて > 【たのしいCocoa】03_C言語の文法

【たのしいCocoa】03_C言語の文法

2008-12-16

【たのしいCocoa】03_C言語の文法

たのしいCocoaプログラミング[Leopard対応版]」を元に、要約メモしておきたいと思います。

チュートリアル: 文法の実験のためのプロジェクト

C言語の実験のためのプロジェクト作成

  1. Xcode を起動する
  2. プロジェクトを作成する 「ファイル > 新規プロジェクト」メニューを選択。Command Line Utility カテゴリの下にある、Standard Tool を選択。できあがったプロジェクトの main.c というファイルがC言語を書くためのファイル。
  3. main.c を編集する 次のようなコードを追加する。バックスラッシュはオプション+¥で入力できる。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    #include <stdio.h>
    int main (int argc, const char * argv[]) {
    // insert code here...
    int i;
    for (i = 0; i < 5; i++) {
    printf("i is %dn", i);
    }
    return 0;
    }

  4. ビルドと実行をする 「ビルド > ビルドと実行」メニューを選択する。次のような結果が表示される。 ※実行結果のウィンドウは「実行 > コンソール」で表示。

    1
    2
    3
    4
    5
    6
    7
    
    [Session started at 2008-00-00 00:00:00 +0900.]
    i is 0
    i is 1
    i is 2
    i is 3
    i is 4
    The Debugger has exited with status 0.

C言語の文法

1
2
3
4
5
6
7
#include <stdio.h>
 
int main (int argc, const char * argv[]) {
// insert code here...
 
return 0;
}

int main… と return 0; の間にソースコードを書いていく。

■ コメント

// か /*…*/ でコメントアウト。

変数

■ 変数の型

意味
char 文字
int 整数
float 小数
double 小数

この型につけることでその意味を少し格調する装飾子。装飾子は主に整数型である int につけることになる。

装飾子 意味
signed 符号あり
unsigned 符号なし
short 短い
long 長い

■ 文字

文字を表す型は char 型。英語のみで、日本語は含まれない。

1
2
char c = 'a'
char letter = 'L';

このように、シングルクォーテーションで文字を代入することができる。

■ 整数

整数のための変数の型が int 型。

1
int i = 0;

■ 小数

floatdouble が、小数のための変数型。float は32ビット、double は64ビット。

1
2
float f = 12.2f;
double value = 1.0;

小数点を使うと小数になり、数字の終わりに f をつけると float 型になる。ない場合が double 型。

■ 変数の名前

アルファベット(大文字小文字は区別される)、数字、アンダースコア。名前を数字で始めることはできない。アルファベットがアンダースコアにする。

■ 名前付けのルール

1
2
3
4
5
6
//単一の単語の場合
int name; //先頭はアルファベットの小文字にする
 
//複数の単語の場合
int childName; //2つめ以降の先頭は大文字にするパターン
int parent_name; //アンダースコアでつなぐパターン

配列とポインタ

■ 配列

変数の名前の後に [] で確保する値の数を書く。たとえば12個の整数の値が欲しい場合は次のように書く。

1
int ages[12];

それぞれの変数にアクセスするときは、同じように [] をつけてインデックスを指定する。

1
2
3
4
5
//最初の変数に値を設定
ages[0] = 24;
 
//値を取り出す
int firstAge = ages[0];

インデックスは0から始めることに注意。

■ ポインタ

ポインタを理解するには、それが最終的にコンピュータのメモリ上に配置されて、CPUに読み取られて、実行されるところを想像しないといけない。

■ ポインタの文法

メモリ上にあるひとまとまりのデータを指し示すために、ポインタ変数と呼ばれる変数を使う。ポインタ変数は、変数型の後(もしくは変数名の前)にアスタリスクを付けることで宣言する。

1
2
char* c0;
char *c1;

C言語の文字列

文字列を作るためには、“” で囲んで記述する。

1
char* osName = "MacOSX";

文字列は char の配列で、配列はひとまとまりのデータなので、配列はポインタで受け取ることができる。

■ NULL値:文字列の終端文字

先ほどの例で、”MacOSX” という文字列を作ったが、その文字列は次のようになっている。

M a c O S X NULL

文字は6文字だけど配列は7文字分確保されている。そして最後のもじは NULL と呼ばれる特殊な文字になっている。これを NULL 終端文字と呼ぶ。NULL は何でもないものやどこでもないところを指す。C言語の文字列では常に NULL が最後にくるので、文字列の大きさは先頭から NULL までの長さを調べればいい。

printf

■ 文字列の出力

指定した文字列を出力することができる。

1
printf ("Mac OS Xn");

■ バックスラッシュ

\n 改行
\r 復帰(キャリッジリターン)
\t タブ
\” ダブルクォーテーション
\\ バックスラッシュそのもの

■ 変数の出力

printf を使って、変数の値を出力することもできる。

1
2
int count = 5;
printf ("count is %d.n", count);

実行結果

1
count is 5.

%d のところが count の値と置き換わっている。これを置換子と呼ぶ。整数のための置換子は %d だが、他の変数のための置換子もある。文字は %c、小数は %f、文字列は %s

1
2
3
4
5
6
7
8
9
10
11
//文字のための置換子
char letter = 'a';
printf ("letter is %c.n", letter);
 
//小数の置換子
float value = 12.5f;
printf ("value is %f.n", value);
 
//文字列のための置換子
char* string = "Cocoa";
printf ("Hello %s!n", string);

実行結果

1
2
3
letter is a.
value is 12.500000;
Hello Cocoa!

演算子

■ 算術演算子

1
2
3
4
5
6
7
8
9
10
11
12
13
 int a, b, c;
a=10;
b=5;
c=a+b;
printf("%dn", c); //cは15になる
 
int d;
d=c-8;
printf("%dn", d); //dは7になる
 
int e;
e=d*4;
printf("%dn", e); //eは28になる

整数型同士の割り算の答えは整数になり、余りは無視される。小数型の割り算の答えは小数になる。

1
2
3
4
5
 int f,g,h;
f=10;
g=3;
h=f/g;
printf("%dn",h); //hは3になる

1
2
3
4
5
double i,j,k;
i=10.0;
j=3.0;
k=i/j;
printf("%fn",k); //kは3.333333になる

割り算の余りを求めるものもあり、剰余演算子モジュロ演算子と呼ぶ。記号は%を使う。

1
2
3
4
5
6
int l, m, n;
l = 100;
m = l/3;
printf("%dn",m); //mは、100を3で割った数なので、33になる
n = l%3;
printf("%dn",n); //nは、100を3で割ったときの余りなので、1になる

計算式を書くときに省略するスタイルもある。+= というように、演算子と等号記号をつなげて書くと、その変数自身に数値を加えるという意味になる。

1
2
i += 1; //i=i+1;と同じ
j -= 2; //j=j-2;と同じ

++ と書くと、1増やすという意味になる、 も使える。

1
2
i++; //i+=1;と同じ
i--; //i-=1;と同じ

■ 比較演算子

a > b aはbより大きいか?
a >= b aはb以上か?
a < b aはbより小さいか?
a <= b aはb以下か?
a == b aはbは等しいか?
a != b aはbは等しくないか?

■ 論理演算子

AND &&
OR ||
NOT !

AND は両方、OR はどちらかが、NOT はではない

制御文

プログラムの流れには、順に進む、条件分岐、繰り返しの3種類がある。

■ if

1
2
3
4
int a = 5, b = 3;
if (a > b) {
 printf("a is larger than bn");
}

条件式は真のときに、{ }(中カッコ)の内部が実行される。{ } を省略した場合は、if 文の次に書いてある1文だけ実行することになる。

比較演算子や、論理演算子を組み合わせて使用する。

1
2
3
4
5
int a = 1, b = 5, c = 2;
//c が、a 以上かつ b 以下であることを判断する
if (a <= c && c <= b) {
 printf("c is equal or larger than a, and is equal or smaller tha bn");
}

条件式の計算結果は真か偽、つまり1か0。C言語では「0だったら正しくない、それ以外だったら正しい」と解釈している。以下の例は正しいということになる。

1
2
3
4
int a = 5;
if (a) {
 print ("a is truen");
}

if-else

if 文では、正しいときに行う処理だけではなく、正しくないときの処理を else で記述できる。

1
2
3
4
5
6
7
int a = 1, b = 5;
if (a > b) {
 printf ("a is larger than bn");
}
else {
 printf ("a is NOT larger than bn");
}

else-if

if 文を何段階も重ねたい場合、else の後に if を続けることもできる。以下は、a が 0 以下か、0 と 5 の間か、それ以上か、というのを判断するためのもの。

1
2
3
4
5
6
7
8
9
10
11
12
int a = 20;
if (a < 0) {
 printf ("a is smaller than 0n");
}
else if (a > 5) {
 printf ("a is equal or larger than 0, and smaller than 5n");
else if (a < 10) {
 printf ("a is equal or larger than 5, and smaller than 10n");
}
else {
 printf ("a is equal or larger than 10n");
}

■ for

1
2
3
4
int i;
for (i = 0; i < 10; i++) {
 printf ("i is %dn", i);
}

i = 0; は初期化の式、i < 10; は繰り返しの条件式、i++ は繰り返しの最後に実行される。

continue と break

繰り返しを途中で強制的にやめたり、次の繰り返しに移動したりする方法。下記の例では、iが2のとき continue を呼び出している。すると、あとの文を無視して次の繰り返しを行う。そしてiが5のときは break 。これを呼ぶと、繰り返しは強制的に終了される。

1
2
3
4
5
6
int i;
for (i = 0; i < 10; i++) {
 if (i == 2) { cotinue; }
 printf ("i is %dn", i);
 if (i == 5) { break; }
}

■ while、do

while 文

下記の例は、先ほどの for 文と同じような動作をするもの。

1
2
3
4
5
 int i=0;
while (i<10) {
 printf ("i is %dn!", i);
 i++;
}

do-while 文

for 文と while 文では、繰り返しの先頭で条件式がチェックされていたが、これを繰り返しの最後で行うもの。do-while の特徴は、繰り返しの処理が少なくとも1回は実行されるが、for や while だと初めに条件式をチェックするので、1回も実行しないことがあり得る。

1
2
3
4
5
 int i=0;
do {
 printf("i is %dn", i);
 i++;
} while (i<10);

■ switch、case

ある式に対して、その値が0か? 1か? 2か? というのをまとめて書くことができる。case に指定する値は、整数の定数でなくてはいけない。case b: などは不可。小数や文字列も使うことができない。case のあとに break を付けないと、その次の case も実行されてしまう。

1
2
3
4
5
6
7
8
 int a;
a=0;
switch (a) {
 case 0: { printf("a is 0n"); break; }
 case 1: { printf("a is 1n"); break; }
 case 2: { printf("a is 2n"); break; }
 default: { printf("a is othern"); break; }
}

次のような、case の重ねが書きをすることもできる。

1
2
3
4
5
6
7
8
switch (a) {
case 0:
case 1:
case 2: {
 printf("a is 0 to 2n");
 break;
}
}

関数

■ 関数の文法

1
int square (int value)

関数から返ってくる値のことを返り値と呼ぶ。だから、square 関数の先頭にある int は、返り値の型を表していることになる。次に、関数に渡す値のことを引数と呼ぶ。先ほどの (int value) が引数。引数は、変数の宣言と同じ型で書く。変数の宣言は型と名前でできているので、それぞれ引数の型引数の名前と呼ぶ。下記のような文法になる。

1
返り値型 関数名 (引数型 引数名)

引数は、複数指定することもできる。

1
int function (int arg0, int arg1, int arg2)

return 文

1
2
3
4
int square (int value)
{
 return value * value;
}

ここでは、引数 value を使って1乗の計算を行っている。return は関数の返り値を指定して、そこで関数の実行を終了させるもの。return の後には変数や式がくる。その値が、関数の返り値として使われる。そして、例えその後にプログラムが続いていても、関数の実行をそこで終えて、呼び出し元に戻る。

void 型

関数によっては返り値がないものもある。そんなときのために、void 型という特別な関数がある。void は無効という意味。返り値型として void を使っている関数では、return で返り値を返す必要がない。例えば、下記のような Hello World! と表示する関数など。

1
2
3
4
 void printHelloWorld()
{
 printf ("Hello World!n");
}

関数の呼び出し

関数の呼び出し方は以下。

1
2
int result;
result = square(4);

呼び出すときは関数の名前を使う。その後にはカッコをつける。関数が引数を取る時は、その数だけ引数を指定する。関数が返り値を返す場合は、変数に代入する。

関数の宣言と実装

関数を書く時には、関数の宣言(.h)関数の実装(.c)とにファイルを分けることになる。関数の宣言ファイルには、関数の名前、返り値、引数の定義だけを書く。関数の実装ファイルには実際の処理を書く。

可変引数

ここまで何度も使っている printf 文printf 関数の宣言は、stdio.h というファイル(/usr/include/stdio.h)にある。 ※Finder の「移動 > フォルダへ移動」で表示させる

1
int printf(const char * __restrict, ...) __DARWIN_LDBL_COMPAT(printf);

この中の は、この関数に指定できる引数の数は固定ではない、ということを示している。このような引数の指定の仕方を可変引数と呼ぶ。

標準ライブラリ

「/usr/include/」の中には、たくさんの便利な関数が提供されている。これらの機能はすべて Cocoa プログラミングの中でカバーされている。以下はその例。

stdio.h

結果の出力や、キーボードからの入力を受け付ける。ファイルの入出力も担当する。printf もここに含まれる。

string.h

文字列を操作するための関数を集めたもの。

math.h

数学に関する関数を集めたもの。

stdlib.h

文字と数値の間で変換をしたり、メモリを確保したりする。

構造体

■ 構造体の宣言

構造体は、いくつかの変数をまとめておくためのもの。例えば、座標を管理するために x と y という2つの変数が必要になる。

1
2
3
//座標のための2つの変数
int x = 10;
int x = 20;

この2つの値は常にペアで使うことになるので、x と y という2つの変数をまとめた、point という名前の構造体を次のように定義できる。

1
2
3
4
5
//point という構造体
struct point {
 int x;
 int y;
};

struct というのが構造体のためのC言語のキーワード。そして、point という構造体の名前が続く。その後には中カッコと、構造体が含む変数の宣言がある。この、x と y といった構造体が持つ変数のことをフィールドと呼ぶ。

構造体の使い方

定義した構造体は、次のように使う。

1
2
3
4
5
6
//point 構造体の、pt という名前の変数を宣言する
struct point pt;
 
//pt のフィールドに値を設定する
pt.x = 10;
pt.x = 20;

まず、構造体の変数を宣言する。その時は先頭に struct を付ける必要がある。ここでは pt という名前の変数にしている。次に、構造体が持つフィールドにアクセスする。それには .(ドット)を使う。ドットの後にフィールドの名前を書くことで、フィールドに値を設定したり、取り出したりする。これで座標に関する情報をまとめておくことができる。

■ typedef を使った構造体の型の宣言

1
2
3
4
5
6
//構造体を使った型を宣言する
//point という名前の型にする
typedef struct {
 int x;
 int y;
} point;

typedef は新しい型を宣言するためのもの。この構造体の型を使うと、次のようにコードを書くことができる。

1
2
3
4
//point を使って変数を宣言する
point pt;
pt.x = 10;
pt.x = 20;

point を、int や char といった型と同じように使うことができる。

こちらの関連記事もあわせてどうぞ

,

  1. 2009 年 8 月 21 日 16:27 | #1

    バックスラッシュが表示されていません。
    \n

  2. 大森
    2009 年 8 月 21 日 20:54 | #2

    ご指摘どうもありがとうございました!

  1. トラックバックはまだありません。