p.090 論理演算子(2項||演算子)
・2項||演算子:左辺と右辺がbool型(p.56)であれば、bool型を返す。
どちらもfalseならfalseを、でなければtrueを返す。よってオア(または)と呼ばれることがある
・if文の条件式に用いると「if(a > 0 || b > 0)」なら「aは正の数、または、bは正の数」と意味する
・論理演算の用語では「論理和」ともいう
・この演算子は、2つの不等式を両辺に置くことで、値の範囲外をチェックするときに便利
例: if(a < 1 || a >= 10) { //aが1未満または10以上であれば
・ただし、同時に成立する式にせぬよう注意
例: if(a >= 1 || a <= 10) { //aが1以上または10以下であれば ←全部になり意味がない
p.090 Chap2_7_2
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Chap2_7_2 : MonoBehaviour {
public int age; //パブリック変数
void Start() {
if (age <= 5 || age >= 65) { //ageの値が5以下または65以上なら
Debug.Log("幼児と高齢者");
}
}
void Update() {
}
}
【補足】複数の||演算子
・2つ以上の||演算子を並べて記述できる 例: a > 0 || b > 0 || c > 0 ・この場合、最初の||でtrueにならなければ、それ以降は無視される ・よって、この構文の後半以降にミスがあると発覚しづらいので注意
【補足】||演算子と短絡評価
・1つの||演算子においても「結果が見えているときは無駄なことはしない」という機能が働く ・つまり、||演算子は左辺がtrueだと、右辺がtrueでもfalseでもtrue確定なので、右辺は見なくなる ・このことも短絡評価(ショートサーキット)という ・これを活用して、プログラムの異常終了を防止できるテクニックがある 例: if(a == 0 || 5 / a > 2) //aが0だと右辺が無視されるので、ゼロ除算による異常終了を防ぐ
【補足】&&演算子と||演算子の併用と優先順位
・&&演算子と||演算子の併用が可能だが、優先順位に注意 ・&&演算子の方が||演算子より優先される 例: if(a > 0 || b > 0 && c > 0) //aが正の数または、bもcも正の数
p.091 単項!演算子
・右辺がbool型(p.56)であれば、反転したbool型を返す。 つまりtrue⇔falseの反転が可能。よってナット(否定)と呼ばれることがある ・主に、複雑な条件を反転したほうがわかりやすい場合や、bool型を返すメソッドを呼んで結果を反転したい場合に用いる ・例: if(!(a == 0 && b == 0 && c == 0)) //「abcがすべてゼロ」じゃなければ ちなみに、これは if(a != 0 || b != 0 || c != 0)) と同じだが、わかりやすい方を用いると良い ・なお、単純にbool型の変数の値をtrue⇔falseの反転をしたい場合にも用いる 例: bool a = true, b = !a; //bにはaのtrueを反転したfalseが入る
p.091 Chap2_7_3
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Chap2_7_3 : MonoBehaviour {
void Start() {
if (!Mathf.IsPowerOfTwo(9)) { //「9が2のべき乗なら」の否定
Debug.Log("2のべき乗ではない");
}
}
void Update() {
}
}
アレンジ演習:p.091 Chap2_7_3
・9を固定ではパブリック変数にして、外部から与えられるようにしよう
作成例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Chap2_7_3 : MonoBehaviour {
public int n; //【追加】パブリック変数「
void Start() {
if (!Mathf.IsPowerOfTwo(n)) { //【変更】「nが2のべき乗なら」の否定
Debug.Log("2のべき乗ではない");
}
}
void Update() {
}
}
【補足】!演算子と&&演算子と||演算子の併用と優先順位
・!演算子と&&演算子と||演算子の併用が可能だが、優先順位に注意 ・!演算子と、&&演算子、||演算子の順に優先される
【補足】!演算子と&&演算子と||演算子の併用とドモルガンの法則
・「論理積の式全体を否定すると、それぞれの否定の論理和になる」という法則 ・例:!(a > 0 && b > 0) ⇒ !(a > 0) || !(b > 0) //どちらも「aもbも正の数」の否定 ・また「論理和の式全体を否定すると、それぞれの否定の論理積になる」 ・例:!(a > 0 || b > 0) ⇒ !(a > 0) && !(b > 0) //どちらも「aかbが正の数」の否定 ・よって、否定の否定を含むような複雑な式は、この法則を用いて整理すると見やすくなることがある
【補足】条件演算子(p.039)
・if-else構文による判断結果の代入を、3項演算子で表現できる仕掛け ・例: int a = 2, b = 3, max = (a > b) ? a : b; //a > b ならaをでなければbを代入 ・書式: (条件式などのbool型の式) ? 式がtrueの時の値 : 式がfalseの時の値 ・これを用いると、p,081 Chap2_5_1のif-elseの5行が1行になる → Debug.Log((age < 20) ? "未成年" : "成人"); ・なお「:」以降の省略は不可(if文でいうifのみ記述は不可)
提出:ミニ演習 mini091
・上記の通り、p,081 Chap2_5_1を書き換えてみよう