RISTイブニングスクール (応用編:第3日A)

演算子と優先順位
数理情報システム工学科
担当: 汐月哲夫
1999/10
プログラム言語 I
1
演算子
演算子
() [] -> .
~ ! ++ -- + - * & (型名) sizeof
* / %
+ << >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /= %= &= ^= <<= >>=
,
1999/10
結合方向
→
←
→
→
→
→
→
→
→
→
→
→
←
←
→
プログラム言語 I
説明
関数、配列、構造体
単項演算
算術演算
算術演算
シフト演算
関係演算
関係演算
ビット演算
ビット演算
ビット演算
論理演算
論理演算
3項演算
代入演算
順序演算
2
算術演算子・関係演算子
演算子
() [] -> .
~ ! ++ -- + - * & (型名) sizeof
* / %
+ << >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /= %= &= ^= <<= >>=
,
1999/10
結合方向
→
←
→
→
→
→
→
→
→
→
→
→
←
←
→
プログラム言語 I
説明
関数、配列、構造体
単項演算
算術演算
算術演算
シフト演算
関係演算
関係演算
ビット演算
ビット演算
ビット演算
論理演算
論理演算
3項演算
代入演算
順序演算
3
算術演算子・関係演算子
演算
数学
C言語
使用例
動作
返す値
算術演算
加算
+
+
a+b
a と b の和
計算結果
減算
-
-
a–b
a と b の差
計算結果
乗算
×
*
a*b
a と b の積
計算結果
除算
÷
/
a/b
a と b の商
計算結果
剰余
mod
%
a%b
a と b の剰余
計算結果
a>b
大小関係に基づく 真理値
真理値
等、不等関係の論 真理値
理値
関係演算
大小関係 > , < , >,<,>=,
<=
≦,≧
==, !=
等、不等 =,≠
1999/10
a==b
プログラム言語 I
4
論理演算子・ビット演算子
演算子
() [] -> .
~ ! ++ -- + - * & (型名) sizeof
* / %
+ << >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /= %= &= ^= <<= >>=
,
1999/10
プログラム言語 I
結合方向
→
←
→
→
→
→
→
→
→
→
→
→
←
←
→
説明
関数、配列、構造体
単項演算
算術演算
算術演算
シフト演算
関係演算
関係演算
ビット演算
ビット演算
ビット演算
論理演算
論理演算
3項演算
代入演算
順序演算
5
論理演算・ビット演算
演算
数学
C言語
使用例
動作
返す値
論理演算
論理積
&&
a && b
ブール代数
論理積
論理和
||
a || b
論理和
論理差
^
a^b
論理差(排他的論理和)
ビット積
&
a & 0x0f
ビット和
|
a | 0x01
ビット差
^
a ^ 0xff
ビット演算
ビ ッ ト ご と の ビットごとの論理積
ブール代数
ビットごとの論理和
ビットごとの論理差
注意: BASICでは ^ はべき乗演算ですが、C言語では
ビット差演算子です。(例: 3^2 = 1)
1999/10
プログラム言語 I
6
ビット演算の例
masking
bit reset
bit set
a & 0x0f
a | 0x01
10111010
&) 00001111
00001010
下位4ビットを
取り出す
(上位4ビットを
0にリセットする)
1999/10
10111010
|) 00000001
10111011
第0ビットを
1にセットする
プログラム言語 I
complement
a ^ 0xff
10111010
^) 11111111
01000101
各ビットの0と
1を反転する
(1の補数)
7
シフト演算
演算子
() [] -> .
~ ! ++ -- + - * & (型名) sizeof
* / %
+ << >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /= %= &= ^= <<= >>=
,
1999/10
結合方向
→
←
→
→
→
→
→
→
→
→
→
→
←
←
→
プログラム言語 I
説明
関数、配列、構造体
単項演算
算術演算
算術演算
シフト演算
関係演算
関係演算
ビット演算
ビット演算
ビット演算
論理演算
論理演算
3項演算
代入演算
順序演算
8
論理シフト演算
unsigned (char, int, long, long long ) が対象
演算
C言語 使用例 動作
右シフト
>>
左シフト
<<
a
a >> 2 2 ビット だけ右 シ シフトの結果
フト
上位 2 ビットは0
a << 2 2 ビット だけ左 シ シフトの結果
フト
下位 2 ビットは0
1 0 1 1 0 1 0 1
a>>2 0 0 1 0 1 1 0 1
1999/10
返す値
1 0 1 1 0 1 0 1
1 1 0 1 0 1 0 0 a << 2
プログラム言語 I
9
算術シフト演算
signed (char, int, long, long long ) が対象
a
演算
C言語 使用例 動作
右シフト
>>
左シフト
<<
返す値
a >> 2 2 ビットだけ右シフト
シフトの結果
上位 2 ビットは最上位ビ
ットのコピー
a << 2 2 ビットだけ左シフト
シフトの結果
下位 2 ビットは0
上位1ビットは不変
1 0 0 1 0 1 0 1 -75 1 1 1 1 0 1 0 1 -11
a>>2 1 1 1 0 1 1 0 1 -19 1 1 0 1 0 1 0 0 -44
1999/10
プログラム言語 I
10
単項演算
演算子
() [] -> .
~ ! ++ -- + - * & (型名) sizeof
* / %
+ << >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /= %= &= ^= <<= >>=
,
1999/10
結合方向
→
←
→
→
→
→
→
→
→
→
→
→
←
←
→
プログラム言語 I
説明
関数、配列、構造体
単項演算
算術演算
算術演算
シフト演算
関係演算
関係演算
ビット演算
ビット演算
ビット演算
論理演算
論理演算
3項演算
代入演算
順序演算
11
単項演算子
演算
C言語 使用例
返す値
種類
単項演算
1の補数
~
~a
a の1の補数
ビット演算
論理否定 NOT
!
!a
a の否定
論理演算
増減
++, --
a++, a--
a+1, a-1
算術演算
+, -
-a
-a
算術演算
間接指定
*
*aptr
aptr が指す変数の値
ポインタ操作
アドレス
&
&a
変数 a のアドレス
アドレス計算
キャスト
(型名)
(int)a
型変換された値
型変換
サイズ
sizeof
sizeof(a)
変数 a の領域サイズ(バイト)
領域サイズ
符号
1999/10
数学
+, -
プログラム言語 I
12
代入演算
演算子
() [] -> .
~ ! ++ -- + - * & (型名) sizeof
* / %
+ << >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /= %= &= ^= <<= >>=
,
1999/10
結合方向
→
←
→
→
→
→
→
→
→
→
→
→
←
←
→
プログラム言語 I
説明
関数、配列、構造体
単項演算
算術演算
算術演算
シフト演算
関係演算
関係演算
ビット演算
ビット演算
ビット演算
論理演算
論理演算
3項演算
代入演算
順序演算
13
代入演算子
基本:
1999/10
変数 = 式
式の値を評価して、変数に代入する
C言語
使用例
等価な動作
=
a=b
a=b
+=
a += b
a=a+b
-=
a -= b
a=a-b
*=
a *= b
a=a*b
/=
a /= b
a=a/b
%=
a %= b
a=a%b
|=
a |= b
a=a|b
&=
a &= b
a=a&b
^=
a ^= b
a=a^b
>>=
a >>= b
a = a >> b
<<=
a <<= b
a = a << b
プログラム言語 I
14
代入演算の左辺と右辺
• =の左辺はアドレスが確定する変数名、ポ
インタでなければならない
• =の右辺は値が評価できる式(計算して値
が確定する式)でなければならない
1999/10
プログラム言語 I
15
その他の演算
演算子
() [] -> .
~ ! ++ -- + - * & (型名) sizeof
* / %
+ << >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /= %= &= ^= <<= >>=
,
1999/10
結合方向
→
←
→
→
→
→
→
→
→
→
→
→
←
←
→
プログラム言語 I
説明
関数、配列、メンバ
単項演算
算術演算
算術演算
シフト演算
関係演算
関係演算
ビット演算
ビット演算
ビット演算
論理演算
論理演算
3項演算
代入演算
順序演算
16
式(expression)
• <式>=数式、関数、演算子の組み合わせ
• 式を評価する=値を計算し返す
• 複数の演算子の評価規則
– 優先順位と結合規則
1999/10
プログラム言語 I
17
演算の優先度
C言語の記述
a+b*c
トークンに分解
a
+
b
*
c
トークンの
属性を認識
2種類の
解釈
優先度が低い
優先度が高い
優先度:
1999/10
プログラム言語 I
‘+’ < ‘*’
18
演算の優先度
a+b*c
a
+
b
*
c
a+(b*c)
1999/10
プログラム言語 I
19
演算の結合規則
C言語の記述
a-b+c
トークンに分解
a
-
b
+
c
トークンの
属性を認識
2種類の
解釈
優先度は同じ
結合規則は
1999/10
優先度:
結合規則:
プログラム言語 I
‘+’ == ‘-’
左→右
20
演算の結合規則
a-b+c
a
-
b
+
c
(a-b)+c
1999/10
プログラム言語 I
21
C言語の演算
高い
低い
1999/10
演算子
() [] -> .
~ ! ++ -- + - * & (型名) sizeof
* / %
+ << >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /= %= &= ^= <<= >>=
,
プログラム言語 I
結合方向
→
←
→
→
→
→
→
→
→
→
→
→
←
←
→
説明
関数、配列、メンバ
単項演算
算術演算
算術演算
シフト演算
関係演算
関係演算
ビット演算
ビット演算
ビット演算
論理演算
論理演算
3項演算
代入演算
順序演算
22
右結合の例
a=b=c=3
a
=
b
=
c
=
3
“c=3”は3という
値を返す
a=(b=(c=3))
1999/10
プログラム言語 I
23
増減演算子(前置、後置)
1999/10
a = b++
a = ++b
a=b
b=b+1
b=b+1
a=b
プログラム言語 I
24
演算順序例
a = func(a,b)
a
=
func
(
a
,
b
)
関数 func() の呼び出し
a=(func(a,b))
1999/10
プログラム言語 I
25
演算順序例
(a+b)*c
(
a
+
b
)
*
c
(a+b)*c
1999/10
プログラム言語 I
26
文法チェック
• 関数のなかで定義されている変数名は、ブロック
内でのみ有効(scope rule)
– 図中の変数名 x はみな異なるメモリ領域に対応
• 3項演算 ?:
– <論理式>?式1:式2
– 論理式が真ならば式1、偽ならば式2を評価する
1999/10
プログラム言語 I
27
選択的実行(if-else文)
偽
<論理式>?式1:式2
論理式
真
if(<論理式>)
<文1>
else
<文2>
1999/10
文1(式1)
プログラム言語 I
文2 (式2)
28