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
-18
60点
、部分点) に比例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,...) がインストールできなかった場合、早めに相談
先週授業に登録しなかった学生は素早く登録のこと!