|| (logical OR) の解説と実装リファレンス

記事内には広告が含まれています。

【概要】

|| は、C/C++(Arduinoのベース言語)において提供される論理OR演算子です。2つの式(オペランド)を評価し、少なくとも一方の式が「真(true)」であれば、全体として「真」を返します。
組み込みシステムにおいては、複数のセンサー入力、ボタンの状態、またはエラーフラグのいずれかが発生した際の条件分岐において極めて頻繁に使用されます。

【仕様】

  • 演算子: || (Logical OR)
  • 引数: 任意のデータ型(整数、ブール値、ポインタなど)。
  • 評価基準:
    • 0 は「偽(false)」とみなされる。
    • 0 以外(1、-1、任意の正の整数など)は「真(true)」とみなされる。
  • 戻り値: bool 型(true または false)。
  • 評価順序: 左から右へ評価される。
  • 短絡評価(Short-circuit Evaluation): 左辺の評価結果が「真」であると確定した場合、右辺の式は評価(実行)されない。

【技術的特徴】

1. 論理OR (||) と ビットOR (|) の差異

| 特徴 | 論理OR (||)
| 評価単位 | 論理的な真偽(真理値)
| 動作原理 | 片方が真なら即座に真を返す(短絡評価あり)
| 用途 | if 文などの条件分岐

| 特徴 | ビットOR (|)
| 評価単位 | 各ビットの独立した値
| 動作原理 | 全ビットを比較し、いずれかが1なら1を返す(短絡評価なし)
| 用途 | レジスタ操作、ビットマスクの合成

2. ハードウェアレベルの挙動

コンパイラは || を評価する際、条件が成立した時点で演算をスキップする分岐命令を生成します。これは、無駄な計算やメモリへのアクセスを抑制し、実行効率を最適化する役割を果たします。

【注意点】

1. 短絡評価による副作用の無視

左辺が真の場合、右辺の式は実行されません。右辺に「関数の呼び出し」や「変数の更新」が含まれている場合、それらがスキップされることに注意が必要です。
– 危険な例: if (is_error || update_counter())
is_error が真の場合、update_counter() は実行されません。

2. 意図しない真偽判定

Arduinoでは int 型の変数が 0 以外であれば true と判定されます。意図しない挙動を防ぐため、比較演算(例: x != 0)を明示的に記述することが推奨されます。

【サンプルコード】

// 2つのボタンのいずれかが押されたか、またはエラーフラグが立っているかを判定する例
const int BUTTON_A = 2;
const int BUTTON_B = 3;
bool system_error = false;

void setup() {
  pinMode(BUTTON_A, INPUT_PULLUP);
  pinMode(BUTTON_B, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  // 短絡評価:BUTTON_Aが押されている(LOW)なら、BUTTON_Bのチェックは行われない
  if (digitalRead(BUTTON_A) == LOW || digitalRead(BUTTON_B) == LOW || system_error) {
    Serial.println("Action Triggered");
    delay(500);
  }
}

【活用例】

  1. 安全インターロック:
    「非常停止ボタンが押されている」または「カバーが開いている」場合にモーターを停止させる制御。
  2. 多重入力監視:
    複数のセンサーのいずれかが閾値を超えた場合にアラートを発報するシステムの構築。
  3. エラーハンドリング:
    「通信タイムアウト」または「メモリ不足」のいずれかが発生した際にリセット処理を実行するロジックの構築。

コメント

タイトルとURLをコピーしました