Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

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