Monthly Archives: April 2022

8.1 マクロ

Published by:

オブジェクト形式マクロ

オブジェクト形式マクロとしての #define は、次のような形式で記述します。

#define マクロ名 置換後の文字の並び

強制されているわけではありませんが、一般的にマクロ名は大文字で表記することが多いです。また、置換後の文字の並びは空にしても構いません

コンパイルを行う直前で、ソースコード上の文字を置換し、その結果をコンパイルするのです。そうすることで、ソースコードの見た目を読みやすいまま保ちつつ、高度な処理を実現できます。

関数形式マクロ

関数形式マクロは、使用時の記述が関数を呼び出しているように見えるため、このように呼ばれます。関数形式マクロの定義は、次のように行います。

#define マクロ名(仮引数のリスト) 置換後の文字の並び

マクロ名の直後に ( ) で仮引数を指定する点が、オブジェクト形式マクロとの違いです。ただし、仮引数に型の指定はありません。仮引数がない場合は void とは書かず、単に ( ) の中を空にします。

通常の関数と異なり、マクロの場合はプリプロセスの段階で置換済みであることを忘れないようにしましょう。関数を呼び出すという行為そのものにも処理時間がかかるのですが、マクロの場合はこの呼び出し自体が発生しませんから、処理効率は向上します。

一方で、マクロを使っている箇所が個別に置換されるため、使用箇所が多いと、プログラムの大きさは増大しやすくなります。

なお、関数のように使うため、置換後の結果を複数行に渡って記述できた方が、見た目の上でも分かりやすくなることがあります。しかし、マクロの置換結果の中で普通に改行を行うことはできません。マクロの置換結果の中で改行を行うには、行末に \ を置きます。

#define INITIALIZE(a,b,c)  \
    (a) = 0; \
    (b) = 0; \
    (c) = 0;

特に、\ の後ろには改行しかあってはならないことに注意してください。

演習

演習 8-1

二つの値xとyの差を求める関数形式マクロを定義せよ。
diff (x, y)

演習 8-2

二つの値xとyの大きいほうの値を求める関数形式マクロは次のように定義できる。
#define max (x, y) (((x) > (y)) ? (x) : (y))
このマクロを利用して、四つの値a, b c d の最大値を求める、 次に示す各式がどのように展開さ
れるかを示し、考察を加えよ。
max (max (a, b), max(c,d))
max (max (max (a, b), c), d)

演習 8-3

type 型の二つの値を交換する、 関数形式マクロを次の形式で定義せよ。
swap (type, a, b)
たとえば、 int 型の変数xとyの値が5と10であるときに、 swap (int, x, y) を呼び出した後は、
xとyには10と5が格納されていなければならない。

7.4 演算子の優先順位

Published by:

表の上に位置するほど、優先順位が高くなります。

優先順位 演算子 名称 使い方
1(高) ()
[]
.
->
++(後置)
ーー(後置)
関数呼び出し
添字演算子
ドット演算子
アロー演算子
インクリメント(後置)
デクリメント(後置)
func()
num[0]
pos.x
pPos->x
num++
num–
2 +

&
*
sizeof
!
~
++
ーー
正符号
負符号
アドレス演算子
間接参照演算子
サイズオブ演算子
論理否定
ビットの論理否定
インクリメント(前置)
デクリメント(前置)
+num
-num
&data
*pdata
sizeof(num)
!num
~num
++num
–num
3 (型名) キャスト (long)num
4 *
/
%
乗算
徐算
剰余
num1 * num2
num1 / num2
num1 % num2
5 +
加算
減算
num1 + num2
num1 – num2
6 <<
>>
左シフト
右シフト
num << 5
num >> 5
7 <
<=
>
>=
小なり
小なりイコール
大なり
大なりイコール
num < 5
num <= 5
num > 5
num >= 5
8 ==
!=
イコール
ノットイコール
num == 5
num != 5
9 & AND演算子 num & 0x7F
10 ^ XOR演算子(排他的論理和) num ^ 0x80
11 | OR演算子 num | 0x80
12 && 論理積 num1 == 0 && num2 == 0
13 || 論理和 num1 == 0 || num2 == 0
14 ?: 三項演算子 num % 2 ? 1 : 0
15 =
+=など
代入
自己代入形式の代入
num = 1
num += 1
16(低) , カンマ num1, num2
スクロールできます

 

7.2 整数型と実数型

Published by:

10進数、2進数、16進数

2進数 10進数 16進数 2進数 10進数 16進数
0 0 0 10001 17 11
1 1 1 10010 18 12
10 2 2 10011 19 13
11 3 3 10100 20 14
100 4 4 10101 21 15
101 5 5 10110 22 16
110 6 6 10111 23 17
111 7 7 11000 24 18
1000 8 8 11001 25 19
1001 9 9 11010 26 1A
1010 10 A 11011 27 1B
1011 11 B 11100 28 1C
1100 12 C 11101 29 1D
1101 13 D 11110 30 1E
1110 14 E 11111 31 1F
1111 15 F 100000 32 20
10000 16 10 100001 33 21

10進数

0~9の10個の数を使い、繰り上がりは、10のべき乗になります。1は100、10は101、100は102、1000は103

2進数

0と1の2個の数を使い、繰り上がりは、2のべき乗になります。1は20、10(10進数では2)は21、100(10進数では4)は22、1000(10進数では8)は23

16進数

0~9の10個の数とアルファベットのA~Fの6個の文字を使い、計16個の英数字を使います。繰り上がりは、16のべき乗になります。1は160、10(10進数では16)は161、100(10進数では256)は162、1000(10進数では4096)は163

整数型と文字型

データの型には次のようなものがあります。

種類 型名 サイズ 値の範囲
文字型 char 1バイト -128 ~ 127
整数型 short int
int
long int
2バイト
4バイト
4バイト
-32768 ~ 32767
-2147483648 ~ 2147483647
-2147483648 ~ 2147483647
浮動小数点型 float
double
long double
4バイト
8バイト
8バイト
3.4E-38 ~ 3.4E+38
1.7E-308 ~ 1.7E+308
1.7E-308 ~ 1.7E+308

符号ありデータの型

種類 型名 サイズ 値の範囲
文字型 unsigned char 1バイト 0 ~ 255
整数型 unsigned short int
unsigned int
unsigned long int
2バイト
4バイト
4バイト
0 ~ 65535
0 ~ 4294967295
0 ~ 4294967295