【概要】
continue は、C++(Arduinoの基盤言語)における制御文の一つであり、ループ処理(for、while、do-while)において、現在実行中のイテレーション(反復)の残りの処理をスキップし、次のイテレーションへ進めるための命令である。特定の条件を満たさない場合に、それ以降の処理を実行せずにループの更新処理へ遷移させる際に用いられる。
【仕様】
- 引数: なし
- 戻り値: なし
- データ型: 予約語(Keyword)
- 動作原理:
continueが実行されると、プログラムの制御は直近のループ構造の更新式(for文の場合)または条件判定式(whileおよびdo-while文の場合)へジャンプする。ループの終了ではないため、ループ自体は継続する。
【技術的特徴】
breakとの比較:breakはループ構造自体を即座に破棄してループ外へ脱出するのに対し、continueはループ構造を維持したまま、現在のステップのみを破棄する。- ハードウェアレベルの挙動: コンパイラは
continueを条件分岐命令(JMP等)に変換する。Arduino(AVR, ESP32, ARMなど)のアーキテクチャを問わず、標準的なC++のコンパイル規則に従う。 - スコープの影響:
continue以降に記述されたコードは、そのイテレーションにおいては実行されない。ただし、continueを呼び出す前に定義された変数のスコープには影響を与えない。
【注意点】
- ネストされたループ:
continueは常に「最内層」のループにのみ作用する。外側のループをスキップしたい場合は、フラグ変数を用いて条件判定を行うのが標準的な設計手法である。 - 無限ループの罠:
while文において、インクリメント処理(例:i++)をcontinueの後に記述している場合、continueが実行されるとインクリメントが行われないため、条件が変化せず無限ループに陥る危険がある。この場合、continueの前にインクリメント処理を配置する必要がある。 - リソース管理: ループ内で動的メモリ確保(
new)やハードウェアレジスタの状態変更を行っている場合、continueによって後続の解放処理やリセット処理がスキップされることで、リソースリークや不整合な状態が発生する可能性がある。処理の原子性を確保するため、continueを実行する前に必要な後処理を完了させておく必要がある。
【サンプルコード】
以下は、センサーデータの配列から異常値(-1)を除外して平均値を計算する実装例である。
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorData[5] = {25, -1, 30, -1, 28}; // -1はエラー値とする
long sum = 0;
int count = 0;
for (int i = 0; i < 5; i++) {
// 異常値(-1)の場合は、以下の計算をスキップして次の要素へ進む
if (sensorData[i] == -1) {
continue;
}
sum += sensorData[i];
count++;
Serial.print("Valid Data: ");
Serial.println(sensorData[i]);
}
if (count > 0) {
float average = (float)sum / count;
Serial.print("Average: ");
Serial.println(average);
}
delay(5000);
}
【活用例】
- データフィルタリング: 通信パケットの解析において、ヘッダーチェックに失敗したパケットをスキップし、次のパケット処理へ移行する処理。
- センサーポーリング: 複数のセンサーを順番に読み取る際、特定のセンサーが「オフライン」状態であることを検知した場合、そのセンサーの処理をスキップする実装。
- ステートマシン: 特定の条件(例:緊急停止フラグが立っている、またはタイムアウト)を満たさない場合に、特定の状態遷移処理をスキップする処理の簡略化。


コメント