2016-05-15 17 views
2

リファレンスブックでこのforループを見つけたばかりですが、単なるポインタなので、比較で何が起こっているのか分かりません。C++:このようなforループは(ポインタを使用して)どのように機能しますか?

char input[300], *p, *q[300], **r = q; 
cin.getline(input, 300); 
for (p = input; *p; p++) 

どのように動作しますか?

+1

これは '* p!= 0'と同じです。 – jtbandes

+0

バンヘッドヒッティングテーブル - 比較はどこですか? –

答えて

4

forステートメントの2番目の式は、「真実性」について評価されます。

for (p = input; *p != 0; p++) 

文字列は、NULLで終了しているので、これはどのように文字列の文字を通して1回の反復処理し、そして:ループは、以下の同等のものに変更する可能性があるため0ザ・と等しくない場合は文字が真であります終わりに止まる。

+1

@selfこれは元々の質問です... – MikeCAT

5

inputはヌルで終了する文字列です。 cin.getlineは、読み取り文字列の最後の文字の後に0を配置します。行が299文字を超える場合は、input[299]になります。

char値は暗黙的にブール値に変換されます。ゼロでなければ真となり、ゼロであれば偽になります。したがって、ループ条件は*p != 0に相当します。

そのため、ループは、文字列の最後であるゼロを見つけるまで配列を反復します。

+0

実際には、それの後にASCII '\ 0'が置かれます。ゼロが同じであるかどうかわかりません。 –

+0

@selfヌル文字は実際にはゼロです。意味論的な理由は別として、これはまた、ゼロに対する比較が通常2つの任意の数を比較するよりも速いので、より高速な反復を可能にする。 –

関連する問題