講義メモ

・p.89「論理演算子」から

提出フォロー:ミニ演習 mini088b.cs・改造

・コンソールから2つの整数を入力して変数aとbに代入し(p.46参照)、小さい方を表示しよう

作成例

//ミニ演習 mini088b.cs・改造
using System;
class mini088a
{
    public static void Main()
    {
        Console.Write("a : "); //表示し改行しない
        int a = int.Parse(Console.ReadLine()); //コンソールから文字列を読み込んで整数化した値で初期化
        Console.Write("b : "); //表示し改行しない
        int b = int.Parse(Console.ReadLine()); //コンソールから文字列を読み込んで整数化した値で初期化
        Console.WriteLine("小さい方は{0}", (a < b) ? a : b); //aとbの小さい方を表示
    }
}

p.89 論理関係演算子・否定演算子

・2つのbool値を返す式の間に置いて、bool値を返す演算
・2項&&演算子:両方がtrueならtrueを、でければfalseを返す。論理積、「かつ」「AND」ともいう
 例: (a > 0 && b > 0) ? "aもbも正の数" : "どちらかは正の数ではない"
・2項||演算子:両方がfalseならfalseを、でければtrueを返す。論理和、「または」「OR」ともいう
 例: (a > 0 || b > 0) ? "aとbのどちらかまたは両方が正の数" : "どちらも正の数ではない"
・単項!演算子:値や式がtrueならfalseを、でければtrueを返す。否定、「NOT」ともいう
 例: !(a > 0) ? "aは正の数じゃない" : "aは正の数"
・単項!演算子は複雑な条件式を反転したい場合に用いる
 例: !(a > 0 && b > 0) ? "「aもbも正の数」ではない" : "aもbも正の数"
・単項!演算子は単純にbool型の変数値を反転したい場合にも便利 bool a = true, b = !a;

p.89 ビット論理演算子

・値を2進数表現にして、ビットごとに計算した結果によるビット列を返す
・2項&演算子:両方が1なら1を、でければ0を返す。
・2項|演算子:両方が0なら0を、でければ1を返す。
・2項^演算子:同じなら0を、でければ1を返す。別名:排他的論理和
・単項~演算子:全ビットを反転した結果を返す。別名:(1の)補数

p.90(短絡評価)

・2項&&演算子と2項||演算子のもつ、途中で結果が確定したときは先に進むという特長のこと
・これにより、無駄な動作の除外が可能
・例:「多くの計算① && 多くの計算②」とすると、多くの計算①がfalseなら②は実行せずにfalse確定
・例:「多くの計算① || 多くの計算②」とすると、多くの計算①がtrueなら②は実行せずにtrue確定
・これにより、異常終了の回避が可能
・例:「a != 0 && 5 / a > 2」とすると、もしもaが0だと「5 / a」は異常終了するが、「a != 0」がfalseになるので
 「5 / a」は実行されない=異常終了の回避が可能

ミニ演習 mini090.cs

・int型の値を入力して「100 / 入力値」が50超かを表示するプログラムを作成しよう
・まず、短絡評価を用いないと0が入力されたときに、異常終了することを確認しよう
・それから、短絡評価を用いて0が入力されたときに、異常終了しないことを確認しよう

作成例 その1 短絡評価を用いないと0が入力されたときに、異常終了する

//ミニ演習 mini090.cs
using System;
class mini090
{
    public static void Main()
    {
        Console.Write("100を何で割る? : "); //表示し改行しない
        int a = int.Parse(Console.ReadLine()); //コンソールから文字列を読み込んで整数化した値で初期化
        Console.WriteLine((100 / a > 50) ? "50超です" : "50以下です"); //結果表示
    }
}

作成例 その2 短絡評価を用いて0が入力されたときに、異常終了しない

//ミニ演習 mini090.cs
using System;
class mini090
{
    public static void Main()
    {
        Console.Write("100を何で割る? : "); //表示し改行しない
        int a = int.Parse(Console.ReadLine()); //コンソールから文字列を読み込んで整数化した値で初期化
        Console.WriteLine((a != 0 && 100 / a > 50) ? "50超です" : "50以下か∞です"); //結果表示
    }
}

p.90 bitwise01.cs

//p.90 bitwise01.cs
using System;
class bitwise01
{
    public static void Main()
    {
        byte a = 2, b = 3; //2進数4桁にすると 2⇒0010 3⇒0011
        Console.WriteLine(a & b); // 0010 & 0011 = 0010 となり10進数の2
        Console.WriteLine(a | b); // 0010 | 0011 = 0011 となり10進数の3
        Console.WriteLine(a ^ b); // 0010 ^ 0011 = 0001 となり10進数の1
        Console.WriteLine(); //改行
        bool x = true, y = false; //trueは2進数の1、falseは2進数の0
        Console.WriteLine(x & x); //1 & 1 = 1 ⇒ True
        Console.WriteLine(x & y); //1 & 0 = 0 ⇒ False
        Console.WriteLine(y & y); //0 & 0 = 0 ⇒ False
        Console.WriteLine(); //改行
        Console.WriteLine(x | x); //1 | 1 = 1 ⇒ True
        Console.WriteLine(x | y); //1 | 0 = 1 ⇒ True
        Console.WriteLine(y | y); //0 & 0 = 0 ⇒ False
        Console.WriteLine(); //改行
        Console.WriteLine(x ^ x); //1 ^ 1 = 0 ⇒ False
        Console.WriteLine(x ^ y); //1 ^ 0 = 1 ⇒ True
        Console.WriteLine(y ^ y); //0 ^ 0 = 0 ⇒ False
    }
}

p.94 代入演算子(及び複合代入演算子)

・代入の「=」記号は、実は2項=演算子で、優先度が低いが用途のバリエーションは多い
・主に四則演算と代入の組み合わせで「● = ● 演算子 式や値」となる場合に、簡略記述に用いられるのが複合代入演算子で
 「● 演算子= 式や値」とできる。
・例:
 x = x + 10; ⇒ x += 10 // xに10を足しこむ
 y = y - 10; ⇒ y -= 10 // yから10を差し引く
 z = z * 5;  ⇒ z *= 5; // zを5倍にする
 w = w / 5;  ⇒ w /= 5; // wを1/5にする
 m = m % 5;  ⇒ m %= 5; // mを5で割った余りにする 応用例⇒ y %= 100; //yを下2桁にする(例:2024⇒24)

p.95 代入演算子(暗黙の型変換)

・同種だが型が異なる変数などへの代入では、左辺より、右辺の対象範囲が広い場合、暗黙の型変換を起こり、問題なく代入される
 例: short s = 5; int i; i = s; //暗黙の型変換が起こり、int型に拡大変換されたsがiに代入される
・拡大変換を丸暗記する必要はないが、実数型から整数型へは不可で、整数型から実数型へは基本的に可能。

p.97 演算子の優先順位

・演算子の優先順位は丸暗記の必要はなく、優先順位が特殊な式ではカッコで優先度を明示すると良い
・なお、代入演算子、複合代入演算子が優先順位最下位であることは意識しておくと良い

p.97 演算子の結合規則

・同じ優先度の演算子が複数並ぶ場合、基本的には左から評価する。これを「左から右への結合」という
 ※ C/C++では「左結合」という
・一部の演算子では「右から左への結合」があり、最も有名なのは代入演算子。
 例: a = b = 5; //5をbに代入し、その評価値である5をaに代入(結果的にaとbに5を代入したことになる)
  つまり「a = (b = 5);」と同じ意味。
 ※ちなみに、初期化における「=」の多重使用(例:int a = b = 1;)は不可。
 「int a = 1, b = 1;」とするか「int a = 1, b = a;」とすれば良い。
 ※なお、2項=演算子の左辺には変数のみ記述可能なので「変数 = 変数 = 変数 = 変数 = 変数 = 変数 = 値や式;」という構文のみ可。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です