・p.94「代入演算子」から
p.94 代入演算子
・2項=演算子:左辺の変数などに、右辺の値や式の評価を代入する ・複合代入演算子:よく用いられる「● = ● 演算子 ■」という式を「● 演算子= ■」とできる。この「演算子=」を複合代入演算子という。 ・例: a = a + 5; ⇒ a += 5; //aに5を足しこむ ・例: a = a - 5; ⇒ a -= 5; //aから5を差し引く ・例: a = a * 5; ⇒ a *= 5; //aを5倍した値にする ・例: a = a / 5; ⇒ a /= 5; //aを1/5倍した値にする ・例: a = a % 5; ⇒ a %= 5; //aを5で割った余りに置き換える ・上記以外に、ビット演算子を用いる「&=」「|=」「^=」「<<=」「>>=」もある。
p.95(暗黙の型変換)
・代入において左辺と右辺のデータ型が異なる場合、左辺が右辺よりも表現範囲が大きい型であれば、自動的に右辺の型が合わされて代入する。 ・例: int a = 5; long l = a; //aの値がlong型に拡大されて代入される ・この事を暗黙の型変換いい、拡大されることを拡大変換という。 ・ただし、一部の組み合わせにおいてはエラーになることがあるので注意。 ・例: Decimal型から他の型へ、符号付き型から符号無し型への拡大変換は不可。
p.97 演算子の優先順位
・暗記する必要はないが、代入と複合代入が優先度最下位であることは憶えておくと良い ・実際の優先順位に関わらず、カッコを用いて優先であることを明示するのが望ましい 例: a + b * c + d ⇒ a + (b * c) + d ・なお、シフト演算子は左辺を2進数に変換し、右辺をシフト数として、2進数を左右シフトした結果を返す 例: 7 << 2 ⇒ 2進数00000111 << 2 ⇒ 2進数00011100 = 10進数28 左へnシフトすると2のn乗倍になり、右にnシフトすると2の-n乗倍(1/2のn乗倍)になるので、CPU内部では掛け算や割り算の実装に 用いられている。また、掛け算や割り算をシフト演算子で書き直すと実行効率が上がる場合がある。
p.97 演算子の結合規則
・同じ演算子を複数並べた場合に、左右どちらから評価するかを結合規則という ・ほとんどの演算子は左から評価する 例:1 + 2 + 3 ⇒ 3 + 3 ⇒ 6 ・代入演算子などでは右から評価する 例:a = b = c = 7 ⇒ a = b = (c = 7) ⇒ a = b = 7 ⇒ a = (b = 7) ⇒ a = 7
p.100 練習問題 考え方
・catを1(2進数0001)、ratを2(2進数0010)、dogを4(2進数0100)で表すと、2進数において1である桁(ビット)で何を飼っているか 表現できる ・しかも、足し算によって、複数を飼っていることを表現できる 例:cat + rat ⇒ 0001 + 0010 = 0011 例:cat + rat + dog ⇒ 0001 + 0010 + 0100 = 0111 ・この加算はビットにおける論理和で表せる 例:cat | rat = 0001 | 0010 = 0011 例:cat | rat | dog = 0001 | 0010 | 0100 = 0111 ・これに対して、飼っているペットを表現する値に、cat(2進数0001)、rat(2進数0010)、dog(2進数0100)の論理積を取ると、 いるならtrueになる。 例:0011 & cat(0001)= 0001 なのでTrue 例:0011 & rat(0010)= 0010 なのでTrue 例:0011 & dog(0100)= 0000 なのでFalse
作成例
//p.100 練習問題 ex04.cs
using System;
class ex04
{
public static void Main()
{
Console.Write("猫(1:いる,0:いない):"); int a = int.Parse(Console.ReadLine());
Console.Write("鼠(2:いる,0:いない):"); int b = int.Parse(Console.ReadLine());
Console.Write("犬(4:いる,0:いない):"); int c = int.Parse(Console.ReadLine());
int sum = a | b | c; //ビット論理和にして10進数で情報を表現
Console.WriteLine("10進数で表現すると{0}", sum);
Console.WriteLine("猫は{0}", (sum & 1) == 1 ? "いる" : "いない"); //ビット論理積で判定
Console.WriteLine("鼠は{0}", (sum & 2) == 2 ? "いる" : "いない");
Console.WriteLine("犬は{0}", (sum & 4) == 4 ? "いる" : "いない");
}
}