私はインターネットで見つけたコードをカスタマイズしています(それは 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言語で記述されていると思います)。
_for(;;) {
}
_
機能的には
_ while (true) {
}
_
おそらく、ループ本体の内部の条件に基づいて、ループを解除します。
for(;;)
が永久にループするのは、for
に3つの部分それぞれがオプションがあるためです。最初の部分はループを初期化します。 2番目はループを続行するかどうかを決定し、3番目は各反復の終わりに何かを行います。これは完全な形式であり、通常は次のようになります。
_for(i = 0; i < 10; i++)
_
最初(初期化)または最後(反復の終わり)のパーツが欠落している場合、その場所では何も行われません。中間(テスト)パーツがない場合、true
がその場所にあるかのように動作します。したがって、for(;;)
はfor(;true;)
'と同じで、(上記のように)while (true)
と同じです。
for
ループには、セミコロンで区切られた3つのコンポーネントがあります。最初のコンポーネントは、ループが始まる前に実行され、一般的に変数を初期化するために使用されます。 2番目は条件です。条件は各反復の開始時にチェックされ、trueと評価された場合、ループ内のコードが実行されます。 3番目のコンポーネントは、ループの終わりに、別の反復(条件チェックで始まる)が始まる前に実行され、変数をインクリメントするためによく使用されます。
あなたの場合、for(;;)
は、条件が存在しないため、ループが永久に続くことを意味します。ループは、コードreturn
sまたはbreak
sで終了します。
for
ループの各句はオプションです。したがって、それらが除外されても、ループします。 for
ループはwhile
ループにコンパイルされます。
最終結果は、変数を初期化するためのチェックになります。変数は空なので何も起こらずに終了します。2番目の句のブール条件へのチェックは存在しないため、ループが開始され、ループが終了ブラケットに到達すると、ブール条件を再度確認する前に実行するコードがあるかどうかを確認します。
コードでは次のようになります。
while(true){
}
Wikipediaの概要 Says について
無限ループとして使用する
反復の基本的なステップは完全にプログラマーの制御下にあるため、このCスタイルのforループは通常、無限ループのソースです。実際、無限ループが意図されている場合、このタイプのforループは(空の式で)次のように使用できます。
for (;;)
//loop body
一部のC/C++コンパイラでは、型変換の警告を回避するために、無限の
while(1)
ループの代わりにこのスタイルが使用されます。一部のプログラマーは、意味的に同等であるがより冗長なfor(;;)
フォームよりも簡潔なwhile (true)
フォームを好みます。