C言語的構文のfor文において、変数宣言部では複数の変数を設定する事が可能です。
まことに恥ずかしい話ではありますが、プログラミングで飯喰って5年は経つのに最近はじめて知りました。
実際のところ
for文の宣言部に書くことで(コンパイラなりVMの実装に依存するにせよ)スコープを限定することができます。
上位スコープなりグローバル変数なりにすればいいじゃ無いかという声も聞こえますが……以下のメリットがあります。
- 責任範囲が明確になるという、保守上の課題がクリアに
- 条件判定の際、一々計算しないので、若干早くなる。
- 再帰関数の場合、都度変数用のメモリ確保してると溺れ死ぬ
C言語
arduinoの例ですが、これまで関数のアタマで変数を宣言していたものが……
void setup() { int y = 30; Serial.begin(9600); while (!Serial) {} for (char x = 2; x < y; x = x * 1.5) { Serial.println(x); } }
実際に使う、for文のところで宣言し直す事で意図が分かり易くなります。
……とはいえ、同じ型である必要はあります。
void setup() { Serial.begin(9600); while (!Serial) {} for (char x = 2, y = 30; x < y; x = x * 1.5) { Serial.println(x); } }
javascript
これは計算量が減る一例
for (var i = 0, j = arguments.length; i < j; i++) { sum += arguments[i]; }
再帰的関数内でfor文をぶん回すという悪魔実装でもスコープ限定が生きてきます。
例はModillaのA re-introduction to JavaScript (JS tutorial) - JavaScript | MDNより。
function countChars(elm) { if (elm.nodeType == 3) { // TEXT_NODE return elm.nodeValue.length; } var count = 0; for (var i = 0, child; child = elm.childNodes[i]; i++) { count += countChars(child); } return count; }