Author: chen
13.1 ファイル
12.2 構造体メンバ
9.2 文字列の配列
9.1 文字列
8.5 入出力と文字
8.1 マクロ
オブジェクト形式マクロ
オブジェクト形式マクロとしての #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 演算子の優先順位
表の上に位置するほど、優先順位が高くなります。
優先順位 | 演算子 | 名称 | 使い方 |
---|---|---|---|
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 整数型と実数型
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 |
Compile a C code on Raspberry Pi
コンパイラをインストール
ソースコードコンパイル
C言語プログラムのファイル名を「hello.c」というファイルを作成します。ファイルの中身は「Hello, World!」という文字列を出力するプログラムです。
hello.cをコンパイルします。
$ gcc hello.c
エラーが表示されなければ、OKです。
プログラムの実行
実行します。
$ ./a.out Hello, World
無事に実行できましたね。
画面コピーをとる
$ scort -sb
マウスでクリックした窓が、画面コピーを取れて、ホームに保存される。