ページ 11

while文について

Posted: 2010年2月21日(日) 22:46
by スルメ
初の質問なので注意事項のテンプレートに沿って記述していきます
自分は今C言語にてゲームプログラミングをしようとがんばっています。
そこでゲームプログラミングの館で修行しているのですが
ttp://dixq.net/g/14.html
の[ソースを短く書く①]
でのwhile文で
ProcessMessage()
ClearDrawScreen()
GetHitKeyStateAll( Key )
Key[KEY_INPUT_ESCAPE]
をまとめるということをしていて
なぜこの文になるのかこんがらがってしまい先に進めません。 
while文自体は
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll(Key ) && !Key[KEY_INPUT_ESCAPE] )
なのですが
!は否定という意味なのでwhile文に照らし合わせると
「4つの内どれかひとつが●●でなかっただったときループ」
という風になると思います。
正確に言えば
「ProcessMessageが0以外でなかったとき、又はClearDrawScreenが0以外でなかったとき、………」
となると思います。
そろそろ分からなくなってきましたよぉ><(汗
「4つの内どれかひとつが0でなかったときループ」
だと4命令的にありえません
「4つの内どれかひとつが0以外でなかったときループ」
で考え方はあっていると思うのですが。。。
上記をシンプルにまとめると…
「4つの内どれかひとつが0でなかったときループから外れる」
と言う考え方なのでしょうか?
そうするとwhile文が捻じ曲がってしまうような…

このwhile文構成でどのように解釈すればいいのでしょうか?
↑この一文が今回の本題です。
どなたか助言お願いします。

Re:while文について

Posted: 2010年2月21日(日) 23:05
by mnkr
>while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll(Key ) && !Key[KEY_INPUT_ESCAPE] )

>「ProcessMessageが0以外でなかったとき、又はClearDrawScreenが0以外でなかったとき、………」

「&&」の意味は「または」ではなく、「かつ」です。

参考情報
C言語では「真」は「0以外の値」です
http://www.geocities.jp/ky_webid/c/014.html

ProcessMessage()で記述するとエラー(返却値 -1)のときだけループする、となるので
否定の「!」をつけて正常時(返却値 0)にループする、となります。
画像

Re:while文について

Posted: 2010年2月21日(日) 23:34
by Dixq (管理人)
(1) && (2) && (3)

は「(1)も(2)も(3)も全部満たした時真」となります。

(1) || (2) || (3)

は「(1)または(2)または(3)のどれかが満たした時真」となります。

!(1) && !(2) && !(3)

は「(1)じゃなく(2)じゃなく(3)でもない時真」となります。

!(1) || !(2) || !(3)

は「(1)じゃないか(2)じゃないか(3)じゃない、どれか一つでも当てはまる時真」となります。

ということで今回の場合


プロセスメッセージ関数が異常ではなく、
クリアスクリーンが異常ではなく、
キー入力状態取得関数が異常ではなく、
「エスケープが押されている」ではない時、

全て満たした時条件式全体は真となるわけです。
おわかりいただけたでしょうか?

Re:while文について

Posted: 2010年2月22日(月) 17:33
by スルメ
皆さんありがとうございます!!

無事問題(疑問?)を解決することができました^^

0以外が真
ってところがミソでしたね…

又困ったときはよろしくお願いします^^

Re:while文について

Posted: 2010年2月22日(月) 17:58
by sizuma
質問内容とは関係ありませんけど、文章は内容の区切りとかで4,5行を目安に改行したほうが見やすくなりますよー