Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

C言語的構文のfor文において、変数宣言部では複数の変数を設定する事が可能

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;
}