whileについて(GetHeadPosition,GetNext)

[戻る]
じろう 2001/10/26(金) 15:31:20
お久しぶりです。じろうです。よろしくお願いします。MFC利用、VC++6.0    

GetHeadPosition,GetNextを利用するとき、よく以下のようにして記述して、リスト(CStringList)の要素を
取得して他のオブジェクトリストに文字列追加しているソースを見ます。


y_pos = list1.GetHeadPosition();
while(y_pos){
    y_str1 = list.GetNext(y_pos);
    y_group_p->AddString(y_str1);
}

自分も同様にして、利用していました。
ただ、急に疑問に思ったこととして、ループの条件が??です。
while(y_pos)とありますが、これはどういう意味ですか?
y_posである間ずっとループする?
GetNextで順次取得していって、ポジションがなくなる?までという意味ですか?
C言語の本を引っ張り出して調べたのですが、考えていると余計混乱してきたので、ヘルプしました。
どなたか教えて頂けないでしょうか。
あと、似たような記述で、

while(file.ReadString(buf,99)){
    list.AddTail(buf);
}
とありますが、これも「ファイルの内容を読みつづけている間中ループする」ということなのでしょうか?
安易な質問かも知れませんが、よろしくお願いします。

YuO [E-Mail] 2001/10/26(金) 16:07:53
> y_pos = list1.GetHeadPosition();
> while(y_pos){
>     y_str1 = list.GetNext(y_pos);
> }
> ただ、急に疑問に思ったこととして、ループの条件が??です。
> while(y_pos)とありますが、これはどういう意味ですか?

while (y_pos != 0)の意味です。
#while (static_cast<bool>(y_pos))が本当なのかも。

> GetNextで順次取得していって、ポジションがなくなる?までという意味ですか?

CList::GetNextやCObList::GetNextでは,
MSDN> 取得した要素がリストの最後のときは、rPosition の新しい値には NULL が設定されます
となっています。つまり,最後の要素をGetNextで取り出したとき,y_posにはNULLが設定されます。
#rPositionは参照渡しです。

結局,ループの条件は,リストの全ての要素を検索し終わるまで,ということになります。


> C言語の本を引っ張り出して調べたのですが、考えていると余計混乱してきたので、ヘルプしました。

whileの条件式に関してはC言語でも使われている範囲内だと思いますが。
もっとも,Cだけではy_posが変更される可能性がわかりませんけどね。


> while(file.ReadString(buf,99)){
>     list.AddTail(buf);
> }
>とありますが、これも「ファイルの内容を読みつづけている間中ループする」ということなのでしょうか?

file.ReadString(buf, 99) != 0が真である間ループします。
結果として,ファイルからなんらかの文字列が読み込めている間ループすることになります。

クラフトマン 2001/10/26(金) 16:17:26
クラフトマンです。

冗長に書けば、while(y_pos != NULL){ となるのでしょうが、
もともとC言語使いは、簡潔に書くのを好むので。
#C++になって、そうも言ってられなくなっているという説もあるが(^^;;

(1)while等は、式の値が0でない間繰り返すことになっている。
(2)GetNext()で最後の要素をとったときには、y_posには、NULLが返される。
(3)NULLは0
(4)演算子なんかなくても立派な式。だから、0とかも式なので、while(0)
   とか書ける。
なので、このループは、全ての要素を取り出します。
(因みに、C/C++では、『0』が偽で、『0ではない』が真です)

ReadStringも同様。こちらは、既にファイルの終端に達していて、
読み込むデータがない場合にNULLが返されるので、ファイルを終
わりまで読むことになります。

クラフトマンです。 2001/10/26(金) 16:37:29
YuOさんの発言とかぶってしまいました。
ごめんなさい。

>#while (static_cast<bool>(y_pos))が本当なのかも。
ああ、なるほど。
でも、なるべくならキャストは使いたくないし、どちらが
いいんだろう。

じろう 2001/10/26(金) 17:39:59
[[解決]]
YuO 、クラフトマンさん レスありがとうございます。
すごく分かりやすかったです。なるほど!という感じでした。
胸のつかえがおかげさまで取れました。

古いスレッドには追加発言できません。