これは一種の間接的な答えですが、この質問は私にその背後にある論理について考えさせました、そしてこれは共有する価値があるかもしれないと思いました。
他の誰もが言っdo ... while
ているように、少なくとも1回は本体を実行する場合は、ループを使用します。しかし、どのような状況でそれをしたいですか?
さて、私が考えることができる最も明白なクラスの状況は、チェック条件の初期(「プライミングされていない」)値が終了したいときと同じである場合です。つまり、ループ本体を1回実行して、条件を存在しない値にプライミングしてから、その条件に基づいて実際の繰り返しを実行する必要があります。プログラマーがとても怠け者だったので、誰かがこれを制御構造にまとめることに決めました。
したがって、たとえば、タイムアウト付きのシリアルポートから文字を読み取ると、次の形式になります(Pythonの場合)。
response_buffer = []
char_read = port.read(1)
while char_read:
response_buffer.append(char_read)
char_read = port.read(1)
# When there's nothing to read after 1s, there is no more data
response = ''.join(response_buffer)
コードの重複に注意してください: char_read = port.read(1)
。Pythonにdo ... while
ループがある場合は、次を使用した可能性があります。
do:
char_read = port.read(1)
response_buffer.append(char_read)
while char_read
ループの新しいスコープを作成する言語の追加の利点:char_read
関数の名前空間を汚染しません。ただし、これを行うためのより良い方法があることにも注意してください。それは、PythonのNone
値を使用することです。
response_buffer = []
char_read = None
while char_read != '':
char_read = port.read(1)
response_buffer.append(char_read)
response = ''.join(response_buffer)
だからここに私のポイントの核心があります:null許容型の言語では、状況initial_value == exit_value
ははるかに少ない頻度で発生します、そしてそれはあなたがそれに遭遇しない理由かもしれません。関数がNone
有効な状態を示すために戻ることがまだあるので、私はそれが決して起こらないと言っているわけではありません。しかし、私の急いで簡単に考えた意見では、使用した言語が意味する値を許可していなかった場合、これはさらに多く発生します。この変数はまだ初期化されていません。
これは完全な推論ではありません。実際には、null値が一般的であるため、変数が取ることができる有効な値のセットのもう1つの要素を形成するだけです。しかし実際には、プログラマーは、変数が適切な状態にあること(ループ終了状態を含む場合があります)と、初期化されていない状態にあることを区別する方法があります。