http://www.sw.it.aoyama.ac.jp/2014/CP1/lecture2.html
© 2005-14 Martin J. Dürst 青山学院大学
演習問題のリスト: http://rpcsr.sw.it.aoyama.ac.jp/courses/6/assignments
提出済みプログラム (課題ごと最善のみ, Best Attempts): http://rpcsr.sw.it.aoyama.ac.jp/attempts?select=best
提出済みプログラム (全部, All Attempts): http://rpcsr.sw.it.aoyama.ac.jp/attempts (注: 一回も提出されてないものは非表示)
注: 深夜にはプログラム効率が激減→早めに一旦切り上げ、翌日作業継続
注: 提出日に質問が不可→先日頑張れるところまで頑張って、質問
int main (void) |
int main (void) |
(字下げ、indent)
+5-1860点、部分点) に比例gcc 02B1.c && ./a を推奨)+, -,
*, /, %)==, !=,
<, >, <=,
>=)||,
&&, !)++,
--)|,
&, ^, ~,
<<, >>)=, +=,
-=, *=, /=, %=,
...)? :)
と順次演算子 (,)[],
*, ., ->)(modulo operator, 情報数学 I 合同算術参照)
% の演算子が整数の割り算の余りを計算
例: 22 % 5 ⇒ 2
応用: 暗号化、繰り返しの高度な組み合わせ、表の形成など (プログラマの数学第 3 章)
(assignment operators)
代入と演算の組み合わせ
例: a = a + b; ⇔ a += b;
他に -=, *=, /=, %=,
<<=, >>=, &=,
|=, ^= がある。
「言い回し」として a += b
の方が完結で分かりやすい
代入演算子は右結合
例:
a * b / c ⇔ (a*b) / c
(左結合、left-associative)
a *= b /= c ⇔ a *= (b/=c)
(右結合、right-associative)
(increment/decrement)
a = a + 1; ⇔ a += 1; ⇔ ++a; ⇔
a++; (インクリメント)
前置インクレメント: b = ++a; ⇔ b = a +=
1;
後置インクレメント: b = a++; ⇔ b = a; a +=
1;
デクリメントは「--」で同様
(side effect)
(bitwise operators)
|」: ビット毎又は
(論理又はは「||」)&」: ビット毎かつ
(論理かつは「&&」)^」:
ビット毎「排他的又は」(論理排他的又ははない)~」: ビット毎否定
(論理否定は「!」)<<」: 左シフト (left shift)>>」: 右シフト (right shift)注意: 計算機内で数値は常に二進数で表現されているので、普段行われている入力と出力以外に変換が不要
(bitwise or)
(16ビット (short) の例。int
は現在多くの PC で 32ビット、一部の高性能の PC で
64ビット)
| 変数・式 | 十進数 | ビット | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
a |
10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
b |
56 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 |
a | b |
58 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 |
応用例: a の最下位の四つのビットをセット
(a |= 0xF) など
(bitwise and)
| 変数・式 | 十進数 | ビット | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
a |
10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
b |
56 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 |
a & b |
8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
応用例:
a の最下位の四つのビットを抽出 (a &
0xF)
a の最下位の四つのビット以外をクリア (a
&= 0xF)
(bitwise exclusive or)
| 変数・式 | 十進数 | ビット | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
a |
10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
b |
56 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 |
a ^ b |
50 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
用途: 暗号など
(bitwise not)
| 変数・式 | 十進数 | ビット | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
a |
10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
~a |
-32758 または 65525 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 |
(left shift)
| 変数・式 | 十進数 | ビット | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
a |
10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
a << 5 |
320 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
応用例: 2n での掛算など (5 ·
27 ⇔ 5 << 7)
(right shift)
| 変数・式 | 十進数 | ビット | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
a |
56 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 |
a >> 4 |
3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
用途: 2n での割り算など
(教科書 p.388/389 参照)
(): 関数、型変換
(cast)、演算のまとめ、if 文など,: 引数の区切り、順序演算-: 単項: 符号反転; 二項: 引き算+: 単項 (型変換以外) 効果なし; 二項:
足し算*: 単項: 参照演算子 (ポインタ); 二項:
掛け算&: 単項: アドレス演算子 (ポインタ); 二項:
ビット毎積自分の PC に Cygwin (gcc,...) がインストールできなかった場合、早めに相談
先週授業に登録しなかった学生は素早く登録のこと!