反復処理

同じような処理を繰り返して実行するようなときには繰り返し文を使用します

繰り返し文を使用することで、プログラムの行数を削減し、プログラムを記述する手間を削減することができます。
また、簡潔なプログラムを書くことにもつながります

for文

任意の処理を任意の回数繰り返して実行することができる文です

繰り返しの条件は文頭で宣言する変数によって行います
この変数をfor文の中で使用することもできます

break 文が処理中にあった場合、ループを強制的に抜け出します
continue 文が処理中にあった場合には、 continue 文以降の処理を一度スキップしてループを続けます

for (変数の初期化; ループ継続条件; 変数の増加もしくは減少処理) {
    // 繰り返す処理
}

// iが0から9まで10回繰り返す
for (int i = 0; i <= 9; i++) {
    // 10回繰り返される処理
}

while文

任意の処理を条件が真になるまで繰り返して実行する文です
条件は if文 と同じように指定します

break 文が処理中にあった場合、ループを強制的に抜け出します
continue 文が処理中にあった場合には、 continue 文以降の処理を一度スキップしてループを続けます

// 22番ピンのスイッチの値がHIGHの間何かしらの処理を行う

const int SWITCH_PIN = 22;

while (digitalRead(SWITCH_PIN) == HIGH) {
    // 何かしらの処理
}

for-each文

for-each文は for文 を拡張した構文です

配列の要素をひとつづつ取り出して、その値を処理したいときに使用します

for(配列の値の型 内部変数名: 配列名) {
    // 処理
}

通常の for文 でそのような処理を記述する場合、以下の例のように、配列の長さを事前に知っている必要があります

int length = 5;
int array[length] = {0, 1, 2, 3, 4};

for(int i = 0; i < length; i++) {
    // iがlengthを超えた場合バグが発生する
    tone(4, array[i] * 100);
    delay(1000);
    noTone(4);
}

上の例を for-each文を利用して記述した例を下に示します

int length = 5;
// lengthはここしか使用しない
int array[length] = {0, 1, 2, 3, 4};

for(int i: array) {
    tone(4, array[i] * 100);
    delay(1000);
    noTone(4);
}

この構文は主にピンの初期化などに有効です

int OUTPUT_PINS = {4, 5, 6, 12, 13, 14, 15};

for(int i: OUTPUT_PINS) {
    pinMode(i, OUTPUT);
}