Presentation is loading. Please wait.

Presentation is loading. Please wait.

プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)

Similar presentations


Presentation on theme: "プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)"— Presentation transcript:

1 プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
C言語入門 第11週 プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)

2 いろいろなプログラム 

3 名前付きの定数 列挙子

4 定数の種類 リテラル 列挙定数 数値リテラル 文字列リテラル
マジックナンバーになると分かり辛いので、マクロか const 変数にして名前付の定数にする。 自動的に名前付定数の数値を割り振ってくれる

5 列挙(enumeration) 列挙子(enumerator)
書式: enum 列挙名 {列挙定数名 [= 定整数値], ...} 値を設定しないと 0から開始 前の値から+1ずつ増加 #define の代わりに使える

6 列挙(enumeration) 列挙子(enumerator)
例: NO = 0 YES = 1 JAN = 1 FEB = 2 MAR = 3 ... DEC = 12 enum boolean {NO, YES}; enum escape { BELL = '\a', BACKSPACE = '\b', TAB = '\t', NEWLINE = '\n', VTAB = '\v', RETURN = '\r'}; enum month { JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC};

7 列挙(enumeration) 列挙子(enumerator)
#define で書き変えた場合の例: #define NO 0 #define YES 1 #define BELL '\a' #define BACKSPACE '\b' #define TAB '\t' #define NEWLINE '\n' #define VTAB '\v' #define RETURN '\r' #define JAN 1 #define FEB 2 #define MAR 3 // ... #define DEC 12

8 関数のようなマクロ パラメータ付きのマクロ

9 パラメータ付きのマクロ #define で定義するマクロに ( ) を付けるとパラメータを与えることが出来る。 1 2 3 4 5 6 7
macro_ex1.c 1 2 3 4 5 6 7 8 #include <stdio.h> #define MIN(X,Y) (X<Y?X:Y) void main() { printf("min: %d\n", MIN(1,2)); } コンパイル前 プリプロセッサにより (1<2?1:2)で置換される

10 パラメータ付きのマクロの注意点 マクロは単純な置換なので置換結果がどうなるか注意する必要がある。 1 2 3 4 5 6 7 8
macro_ex2_1.c 1 2 3 4 5 6 7 8 #include <stdio.h> #define POW2(X) (X*X) void main() { printf("pow2: %d\n", POW2(2)); } コンパイル前 プリプロセッサにより (2*2)と置換される

11 パラメータ付きのマクロの注意点 マクロは単純な置換なので置換結果がどうなるか注意する必要がある。 1 2 3 4 5 6 7 8
macro_ex2_1.c (2+1)*(2+1)=9 ではなく 2+(1*2)+1=5 になってしまう 1 2 3 4 5 6 7 8 #include <stdio.h> #define POW2(X) (X*X) void main() { printf("pow2: %d\n", POW2(2+1)); } コンパイル前 プリプロセッサにより (2+1*2+1)と置換される

12 パラメータ付きのマクロの注意点 マクロは単純な置換なので置換結果がどうなるか注意する必要がある。 1 2 3 4 5 6 7 8
macro_ex2_2.c パラメータはなるべく括弧で括る 1 2 3 4 5 6 7 8 #include <stdio.h> #define POW2(X) ((X)*(X)) void main() { printf("pow2: %d\n", POW2(2+1)); } コンパイル前 プリプロセッサにより ((2+1)*(2+1))と置換される

13 パラメータ付きのマクロの注意点 マクロは単純な置換なので置換結果がどうなるか注意する必要がある。 1 2 3 4 5 6 7 8 9
macro_ex2_3.c マクロのパラメータに 副作用を伴う演算を用いては駄目 1 2 3 4 5 6 7 8 9 #include <stdio.h> #define POW2(X) ((X)*(X)) void main() { int x=2; printf("pow2: %d\n", POW2(++x)); } コンパイル前 プリプロセッサにより ((++x)*(++x))と置換され 結果として 3*4 になってしまう

14 swap 値の交換

15 値の交換 以下のケースで x,y の値を交換するにはどうしたら良いか? int x = 10; int y = 20;
y = x; こうするとxは既に 20で上書きされているので、 両方20になってしまう。

16 値の交換 中間変数を用いると良い int x = 10; int y = 20; int tmp; // 以下で x,y の値を入れ替えたい
y = tmp; こうやると中間変数tmpに保存された xの値10をyに入れることで x,yの値を入れ替える事が出来る。

17 値の交換 マクロにしてみる macro_ex3.c
#define SWAP(TYPE,X,Y) {TYPE SWAP_tmp=X; X=Y; Y=SWAP_tmp;} int x = 10; int y = 20; // 以下で x,y の値を入れ替えたい SWAP(int, x, y); ブロック内のローカル変数として 中間変数を作成 プリプロセッサにより 以下のように置換される // 以下で x,y の値を入れ替えたい {int SWAP_tmp=x; x=y; y=SWAP_tmp;};

18 参考文献 [1] B.W.カーニハン/D.M.リッチー著 石田晴久 訳、プログラミング言語C 第2版 ANSI 規格準拠、共立出版(1989)


Download ppt "プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)"

Similar presentations


Ads by Google