Progrust Library.

// dictionary

論理演算子.

論理演算子は、論理値型の値を組み合わせて新しい論理値を作る演算子です。比較演算子(==>=など)の結果を「かつ」「または」で組み合わせる条件式でよく使います。

演算子 意味
&& 論理AND(かつ) true && falsefalse
|| 論理OR(または) true || falsetrue
! 論理NOT(否定) !truefalse
fn main() {
    let age = 20;
    let has_ticket = true;
    let can_enter = age >= 18 && has_ticket; // 18歳以上かつチケットあり
    println!("入場{}", if can_enter { "できます" } else { "できません" });
}
Playgroundで開く

短絡評価

&&||短絡評価(short-circuit evaluation)を行います。左辺だけで結果が確定する場合、右辺は評価されません。

  • &&: 左辺がfalseなら右辺を評価せずfalseを返します
  • ||: 左辺がtrueなら右辺を評価せずtrueを返します

この性質を使うと「右辺を評価すると危険な式」を安全に書けます。

短絡評価の活用例(0除算の回避)
fn main() {
    let total = 300;
    let count = 0;
    // countが0のとき右辺の除算は実行されないため、パニックしない
    if count > 0 && total / count >= 100 {
        println!("1個あたり100円以上です");
    } else {
        println!("計算できないか、100円未満です");
    }
}
Playgroundで開く

補足

短絡評価しない論理演算子(& | ^)

boolには&(AND)・|(OR)・^(XOR)も適用でき、こちらは短絡評価せず両辺を必ず評価します1。副作用のある式を必ず実行したい場合や、排他的論理和が必要な場合に使います。なお、^に対応する短絡評価版はありません(XORは両辺の値が揃わないと結果が決まらないため)。

複合代入と対応するトレイト

& | ^には複合代入演算子(&= |= ^=)がありますが、短絡評価する&& ||には複合代入形(&&= ||=)は存在しません

また、!std::ops::Not&BitAnd|BitOr^BitXorトレイトに対応しており、独自の型にも実装できます。一方、短絡評価する&&||はトレイトに対応しておらず、bool型の値専用です(&boolのような参照はそのままでは使えず、*によるデリファレンスが必要です)。

他言語との違い(truthy/falsyはない)

JavaScriptなどの||は「左辺がfalsyなら右辺の値そのものを返す」ため、name || "ゲスト"のようなデフォルト値の指定に使えます。一方Rustの論理演算子はbool専用で結果も必ずboolのため、この書き方はできません。数値や文字列にtruthy/falsyの概念もなく、条件には明示的な比較式を書きます。

fn main() {
    let count = 3;
    if count || count > 10 { // エラー: E0308(boolではなく整数を渡している)
        println!("在庫あり");
    }
}
Playgroundで開く

「なければデフォルト値」はRustではOption型unwrap系のメソッドで表現します(例: name.unwrap_or_else(|| "ゲスト".to_string()))。

Footnotes

  1. The Rust Reference: Arithmetic and logical binary operators

この辞書が使われているページ

backlinks 4

  1. 辞書if let式
  2. 辞書if式
  3. 辞書while式
  4. 動かして学ぶRustプログラミング問題集 › 第2章 基本の型と演算