web-dev-qa-db-ja.com

forループ括弧内の2つのセミコロン

私はインターネットで見つけたコードをカスタマイズしています(それは Adafruit Tweet Receipt です)。コードの多くの部分を理解することはできませんが、私にとって最も厄介なのは、括弧内に2つのセミコロンがあるforループです

boolean jsonParse(int depth, byte endChar) {
  int c, i;
  boolean readName = true;

  for(;;) {  //<---------
    while(isspace(c = timedRead())); // Scan past whitespace
    if(c < 0) return false; // Timeout
    if(c == endChar) return true; // EOD

    if(c == '{') { // Object follows
      if(!jsonParse(depth + 1, '}')) return false;
      if(!depth) return true; // End of file
      if(depth == resultsDepth) { // End of object in results list

for(;;)はどういう意味ですか? (これはArduinoプログラムなので、C言語で記述されていると思います)。

28
osse
_for(;;) {
}
_

機能的には

_ while (true) {
 }
_

おそらく、ループ本体の内部の条件に基づいて、ループを解除します。

for(;;)が永久にループするのは、forに3つの部分それぞれがオプションがあるためです。最初の部分はループを初期化します。 2番目はループを続行するかどうかを決定し、3番目は各反復の終わりに何かを行います。これは完全な形式であり、通常は次のようになります。

_for(i = 0; i < 10; i++)
_

最初(初期化)または最後(反復の終わり)のパーツが欠落している場合、その場所では何も行われません。中間(テスト)パーツがない場合、trueがその場所にあるかのように動作します。したがって、for(;;)for(;true;) 'と同じで、(上記のように)while (true)と同じです。

60
taocp

forループには、セミコロンで区切られた3つのコンポーネントがあります。最初のコンポーネントは、ループが始まる前に実行され、一般的に変数を初期化するために使用されます。 2番目は条件です。条件は各反復の開始時にチェックされ、trueと評価された場合、ループ内のコードが実行されます。 3番目のコンポーネントは、ループの終わりに、別の反復(条件チェックで始まる)が始まる前に実行され、変数をインクリメントするためによく使用されます。

あなたの場合、for(;;)は、条件が存在しないため、ループが永久に続くことを意味します。ループは、コードreturnsまたはbreaksで終了します。

2
Fls'Zen

forループの各句はオプションです。したがって、それらが除外されても、ループします。 forループはwhileループにコンパイルされます。

最終結果は、変数を初期化するためのチェックになります。変数は空なので何も起こらずに終了します。2番目の句のブール条件へのチェックは存在しないため、ループが開始され、ループが終了ブラケットに到達すると、ブール条件を再度確認する前に実行するコードがあるかどうかを確認します。

コードでは次のようになります。

while(true){

}
2
Travis J

Wikipediaの概要 Says について

無限ループとして使用する
反復の基本的なステップは完全にプログラマーの制御下にあるため、このCスタイルのforループは通常、無限ループのソースです。実際、無限ループが意図されている場合、このタイプのforループは(空の式で)次のように使用できます。

for (;;)
//loop body

一部のC/C++コンパイラでは、型変換の警告を回避するために、無限のwhile(1)ループの代わりにこのスタイルが使用されます。一部のプログラマーは、意味的に同等であるがより冗長なfor(;;)フォームよりも簡潔なwhile (true)フォームを好みます。

2
Suraj Jain