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

「たのしいCocoaプログラミング[Leopard対応版]」を元に、要約メモしておきたいと思います。
チュートリアル: 文法の実験のためのプロジェクト
C言語の実験のためのプロジェクト作成
- Xcode を起動する
- プロジェクトを作成する 「ファイル > 新規プロジェクト」メニューを選択。Command Line Utility カテゴリの下にある、Standard Tool を選択。できあがったプロジェクトの main.c というファイルがC言語を書くためのファイル。
- 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; }
- ビルドと実行をする 「ビルド > ビルドと実行」メニューを選択する。次のような結果が表示される。 ※実行結果のウィンドウは「実行 > コンソール」で表示。
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; |
■ 小数
float と double が、小数のための変数型。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 といった型と同じように使うことができる。
外部リンク
- »連載:目指せ!iPhoneアプリ開発エキスパート|gihyo.jp … 技術評論社
- »iPhoneネイティブアプリ開発の必読リンク5本 | iPhone 3G Wiki blog
- »【特集】iPhoneアプリケーション開発入門 | エンタープライズ | マイコミジャーナル
- »自作アプリをApp Storeで世界に向けて販売できる!! iPhone SDKプログラミング大全
こちらの関連記事もあわせてどうぞ
- »【たのしいCocoa】04_Objective-Cの文法
- »【たのしいCocoa】07_文字列
- »【たのしいCocoa】08_コレクション
- »【たのしいCocoa】06_メモリ管理
- »【たのしいCocoa】02_Hello World!: はじめてのCocoaアプリケーション
- »【たのしいCocoa】05_RSSリーダ
- »【たのしいCocoa】01_開発環境の設定と、アプリケーションのプログラミング
- »【Mac/iPhone/iPad】iDiskに入れたtxtファイルの文字化けを防ぐ方法
- »【iPhone】計算機の使い方【MC, M+, M-, MR】
- »【iPhone】マルチタッチディスプレイのひ・み・つ

バックスラッシュが表示されていません。
\n
ご指摘どうもありがとうございました!