演算子と優先順位 数理情報システム工学科 担当: 汐月哲夫 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
© Copyright 2024 ExpyDoc