Re: 元のマスに戻ったあと前のマスに行けない ( No.28 ) |
- 名前:紺帽子 日時:2019/09/30 20:06
> if (addattacktime <= 500 && --addattacktime > 0)
> は先に優先順位が高い--addattacktimeが行われます.その次に&&の左右の比較が行われ,最後に,&&が行われます
論理演算子は左から順に評価されます。
if (addattacktime <= 500 && --addattacktime > 0)
は、
1.(addattacktime <= 500)
2.(--addattacktime > 0)
の順に評価されます。
またその評価は全体の真、偽が決定した時点で終わるため
1.(addattacktime <= 500)
が偽になった時点で全体の式が真になることはないため打ち切られます。
よって
2.(--addattacktime > 0)
は実行されません。
サンプルコード
ttps://ideone.com/JgXLtS
優先順位と評価順序 | Microsoft Docs
ttps://docs.microsoft.com/ja-jp/cpp/c-language/precedence-and-order-of-evaluation?view=vs-2019
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.29 ) |
- 名前:マーク42 日時:2019/09/30 23:37
紺帽子さんありがとうございます!
あのどんさんに質問なのですが、
if (addattacktime == 501 && count < 50)
では,addattacktime==501が行われ,count < 50が行われ,&&が実行されます
とのことですが、
addattacktime == 501 && count < 50
は,count < 50 が先に行われ,次に501 && count < 50となり,最後に,代入が行われます.
なので,count < 50の真偽と501の倫理積の結果がaddattacktimeに代入されます.
に関してなのですが、攻撃するとcountは0なので、count<50は真になり、addattacktime == 501の時に以下の{}が実行されると思うのですが、
if (addattacktime == 501 && count < 50) ++frames;//framesが5で割りきれる時に+countが+1されいく。//countが50より小さい時、framesがフレームにより+1ずつされていき、10で割り切れる際にcountが50になるまで+1される、++により最初+1が追加され49かい+1されるので結果的にcountは50になる。
if (frames % 5 == 0) {
++count; if (count > 50) { count = 50; }//★上限はないためcountが49より大きくなったらcount = 50により50にする。
}
実際はされません。優先順位があるとはいえ、なぜaddattacktime==501とcount < 50は両方とも真なのに、{}の中身が実行されなかったのでしょうか。
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.30 ) |
- 名前:どん 日時:2019/10/01 01:39
{}とは,どの部分のことでしょうか
どちらの{}にしろ,
if (addattacktime == 501 && count < 50)++frames;
は,条件を満たしても,後ろの++frames;しか実行されません.
if (addattacktime == 501 && count < 50) ++frames;
と
if (frames % 5 == 0) {
++count; if (count > 50) { count = 50; }//★上限はないためcountが49より大きくなったらcount = 50により50にする。
}
は完全に独立しているので,if (addattacktime == 501 && count < 50)
を満たしているのと,{}の中身の実行は,別の話です.
インデントしているので,そう見えてしまっていると思いますが,入れ子にはなっていないので,
整理し直したほうがいいと思います.
{}の中が実行されない原因は,今のソースコードの状態がないのでわかりませんが,printfや,MessageBox関数を入れて,
どこまで実行されているのかを確認したらいいと思います
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.31 ) |
- 名前:マーク42 日時:2019/10/01 02:02
addattacktime<=500&&--addattacktime>0に関しては
&&であるが、全体の--が優先されるため、500<=0は「無視」され、addattacktimeは500なので-1されていき、と>0に関しては>0に対して偽なので、結果は偽になり、処理はされずaddattacktimeは負の値になったため、addattacktimeが負の場合に送られて、その時の{ }の処理を行い、addattacktimeは1となり、上を繰り返していて-1になった。
以上のようにaddattacktime<=500&&--addattacktime>0の処理のされ方を考えたのですが、正しいでしょうか?
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.32 ) |
- 名前:マーク42 日時:2019/10/01 02:33
どんさん、どうもありがとうございます!
すいません、{}ではなく、
if (addattacktime == 501 && count < 50) ++frames;//framesが5で割りきれる時に+countが+1されいく。//countが50より小さい時、framesがフレームにより+1ずつされていき、10で割り切れる際にcountが50になるまで+1される、++により最初+1が追加され49かい+1されるので結果的にcountは50になる。
if (frames % 5 == 0) {
++count; if (count > 50) { count = 50; }//★上限はないためcountが49より大きくなったらcount = 50により50にする。
}
の
++frames;//framesが5で割りきれる時に+countが+1されいく。//countが50より小さい時、framesがフレームにより+1ずつされていき、10で割り切れる際にcountが50になるまで+1される、++により最初+1が追加され49かい+1されるので結果的にcountは50になる。
if (frames % 5 == 0) {
++count; if (count > 50) { count = 50; }//★上限はないためcountが49より大きくなったらcount = 50により50にする。
}
の部分です。後ろの++frames;しか実行されません.と教えて頂けたことで分かったので、
{}としていないことで反映されていなかったのかもしれません。
これからは{}を付けて処理をまとめます。
ただ、仮に{}を付けて以下のようにして、実行してもcountは1にしかなりませんでした。
if (addattacktime == 501 && count < 50) {
++frames;//framesが5で割りきれる時に+countが+1されいく。//countが50より小さい時、framesがフレームにより+1ずつされていき、10で割り切れる際にcountが50になるまで+1される、++により最初+1が追加され49かい+1されるので結果的にcountは50になる。
if (frames % 5 == 0) {
++count; if (count > 50) { count = 50; }//★上限はないためcountが49より大きくなったらcount = 50により50にする。
}
}
このプログラムにおいては{}を付けて実行したのに、フレームが反映されないのはaddattacktime == 501の値が固定されてしまっているため
この固定された値とは別に以下のようにif(count < 50)の時と書く必要があるのかもしれません。(優先順位とかではなく、値が固定されてしまったために
countが1度しか働かなかったのかもしれません。)
もし違った場合は正しい理由を教えて頂けるとありがたいです。
if(addattacktime == 0) {
playerX = preplayerX;
playerImage = playerGHandle[4];
addattacktime = 501;//addattacktimeが0にると、元の位置に戻る
}
if(addattacktime == 501){
//★あるフレームが進んでから画像がを動くまでを遅くした、ならば、あるフレームが進んだら数字も次の数字に移るまで遅くできるのは?と考えた。
if(count < 50) ++frames;//framesが5で割りきれる時に+countが+1されいく。//countが50より小さい時、framesがフレームにより+1ずつされていき、10で割り切れる際にcountが50になるまで+1される、++により最初+1が追加され49かい+1されるので結果的にcountは50になる。
if(frames % 5 == 0) {
++count; if(count > 50) { count = 50; }//★上限はないためcountが49より大きくなったらcount = 50により50にする。
}
以下のように書いてはif(addattacktime == 0)が真のとき(addattacktimeが0の時)でないと中に含んだif(addattacktime == 501)
の時の{}の中の処理を行わないので(addattacktimeが501になっては前のif文if(addattacktime == 0)は偽になってしまうため、
if(addattacktime == 501)の{}の処理が行われない。そのためaddattacktimeが501になってもcountは繰り上がらなかった。)
上のように{}とは別に新しいif文でif(addattacktime == 501)を書く必要があります。
if(addattacktime == 0) {
playerX = preplayerX;
playerImage = playerGHandle[4];
addattacktime = 501;//addattacktimeが0にると、元の位置に戻る
if(addattacktime == 501){
//★あるフレームが進んでから画像がを動くまでを遅くした、ならば、あるフレームが進んだら数字も次の数字に移るまで遅くできるのは?と考えた。
if(count < 50) ++frames;//framesが5で割りきれる時に+countが+1されいく。//countが50より小さい時、framesがフレームにより+1ずつされていき、10で割り切れる際にcountが50になるまで+1される、++により最初+1が追加され49かい+1されるので結果的にcountは50になる。
if(frames % 5 == 0) {
++count; if(count > 50) { count = 50; }//★上限はないためcountが49より大きくなったらcount = 50により50にする。
}
}
}
addattacktime<=500&&--addattacktime>0に関しては
&&であるが、全体の--が優先されるため、500<=0は「無視」され、
addattacktimeは500なので-1されていき、と>0に関しては>0に対して偽なので、結果は偽になり、
処理はされずaddattacktimeは負の値になったため、addattacktimeが負の場合に送られて、その時の{ }の処理を行い、
addattacktimeは1となり、上を繰り返していて-1になった。
と書きましたが、これは&&による<=や>よりも--が優先され(&&による<=や>は無視された?)、引き算され、
500より小さく、0より大きい値までとのことで値は固定ではないため
繰り返し引き算され、--が優先されたため、addattacktimeは負の値になったと考えました。
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.33 ) |
- 名前:マーク42 日時:2019/10/01 16:14
どんさんに質問があるのですが
if(count < 50) ++frames;
if(frames % 5 == 0) {
++count; if(count > 50) { count = 50; }
}
if(Kcount < 50 && count >= 50) ++frames;//すでに足されているときはしない
if(frames % 20 == 0) {
++Kcount; if(Kcount > 50) { Kcount = 50; }
}
の
if(Kcount < 50 && count >= 50) ++frames;//すでに足されているときはしない
if(frames % 20 == 0) {
++Kcount; if(Kcount > 50) { Kcount = 50; }
}
に関してなのですが、Kcount < 50 && count >= 50の&&により<と>=は優先されますが、
なぜcountが50以上の時にKcountが50より小さい時に+1ずつ繰り上げるのでしょうか。
実際にはcountとKcountが同フレームで上がっていきますが、なぜこのように書けたのかわかりません。
Kcount < 50は50より小さい時なのでわかるのですが、そのあとのcountが50以上の時と書くと、
countが50以上の時にKcountが50より小さいため上がっていく、すなわちcountが50になってからKcountが上がっていくように思えました。
なぜcountはcount >= 50と書けたのでしょうか。
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.34 ) |
- 名前:どん 日時:2019/10/01 21:01
同フレームでKcountとcountが変化しない理由として,framesが2回足されているのが原因ではないかと思いました
if(count < 50) ++frames;
if(frames % 5 == 0) {
++count; if(count > 50) { count = 50; }
}
if(Kcount < 50) ++frames;
if(frames % 20 == 0) {
++Kcount; if(Kcount > 50) { Kcount = 50; }
}
この場合,count,Kcountが共に50未満の場合,framesが19だったとすると,1行目で,framesが20になり,
2行目のif文の中に入りますが,5行目でもframesが足され21になり,6行目のif文内には入りません.
frames++は一回だけでいいのでは?と思ったので,
if(count < 50) ++frames;
if(frames % 5 == 0) {
++count; if(count > 50) { count = 50; }
}
if(Kcount < 50 && count >= 50) ++frames;//すでに足されているときはしない
if(frames % 20 == 0) {
++Kcount; if(Kcount > 50) { Kcount = 50; }
}
としました.
6行目に条件を追加することで,count,Kcountが共に50未満の場合でも,1行目の条件は満たされますが,
6行目は満たされないようにしました.
6行目の条件を満たすには,Kcountが50未満で,countが50以上,つまり,1行目が実行されていない場合のみ実行されるようになります.
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.35 ) |
- 名前:マーク42 日時:2019/10/03 06:49
どんさんありがとうございます!
ちゃんと理解できるように何度も読んで理解します。
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.36 ) |
- 名前:マーク42 日時:2019/10/03 18:53
countが50以上でなくてもKcountが上がるようにKcount < 50 && count >= 50と書いたということでしょうか。
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.37 ) |
- 名前:どん 日時:2019/10/03 21:22
countとKcountが共に50より大きくてもframesを一回だけしか足さないようにしたということです
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.38 ) |
- 名前:マーク42 日時:2019/10/04 19:44
ありがとうございます。どんさん。
countのframeが上がるたびに、
Kcountに&&countとする事で
同時にKcountが上がるわけでしょうか?
理解が悪くてすいません。
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.39 ) |
- 名前:どん 日時:2019/10/04 20:58
いまいち質問の意図がわからず間違えていたらすいません
if(count < 50) ++frames;
if(frames % 5 == 0) {
++count; if(count > 50) { count = 50; }
}
if(Kcount < 50) ++frames;
if(frames % 20 == 0) {
++Kcount; if(Kcount > 50) { Kcount = 50; }
}
このソースコードでは,framesが5の倍数のときに,countが上がり,20の倍数のときに,Kcountが上がります.
別々にframesを足していることで,
例えば,framesが19,countが10,Kcountが10だったときに,上のコードが実行されたとすると,1行目のif文の条件が真となり,
framesが20になります.そうすると,2行目のframesが5の倍数でアルということを満たし,countが1足されます.
しかし,5行目の条件も真となり,またframesが足され,framesが21となり,6行目の条件を満たさなくなってしまい,
結果的に,countとKcountが同時にカウントアップしなくなってしまいます.
そこで,このコードが実行されたときに,framesが最大で1回しか足されないようにします.
ここまでは大丈夫でしょうか?
if(count < 50) ++frames;
if(frames % 5 == 0) {
++count; if(count > 50) { count = 50; }
}
if(Kcount < 50 && count >= 50) ++frames;//すでに足されているときはしない
if(frames % 20 == 0) {
++Kcount; if(Kcount > 50) { Kcount = 50; }
}
5行目にcount >= 50を追加することで,1行目が実行された条件を満たしているか否かを判断します.
1行目のframes++が実行されたということは,countは50未満です.すると,5行目の条件の後半を満たさないので,5行目のframes++は実行されません.
1行目でframes++が実行されなければ,countは50以上なので,5行目の条件の後半を満たし,5行目のframes++は実行されます.
ややこしいようなら,次のようにしたほうがいいかもしれません
int flag = 0;//framesが1回足されたかを見張る変数
if(count < 50){
++frames;
flag = 1;//1回frames++を実行した
}
if(frames % 5 == 0) {
++count; if(count > 50) { count = 50; }
}
if(Kcount < 50 && flag == 0) ++frames;//すでに足されているときはしない
if(frames % 20 == 0) {
++Kcount; if(Kcount > 50) { Kcount = 50; }
}
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.40 ) |
- 名前:マーク42 日時:2019/10/05 11:59
返信ありがとうございます。
>>countは50以上なので,5行目の条件の後半を満たし,5行目のframes++は実行されます
countが50以上という設定をすることでcountが50以上の時のKcountとなり、同時に上がることが出来るということでしょうか。
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.41 ) |
- 名前:どん 日時:2019/10/05 16:13
いまいち質問の意味がわかりませんが,1行目の逆の条件を5行目に追加することで,
絶対にどちらか一方しか実行されないようにしています
もしかしたら,意図が伝わっていないかもしれないので,
どこまで把握しているかを教えてくれるとありがたいです.
1.countとKcountが同時に上がらない原因については,理解できましたか?
2.1が理解した上で,framesを1度だけ足せばいいというのはわかりましたか?
3.2の具体的な方法がわからないのでしょうか?
上記についてどこまで把握しているのかを教えてくれると助かります
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.42 ) |
- 名前:マーク42 日時:2019/10/07 00:38
返信遅くなり申し訳ありません。
ご親切にどうもありがとうございます。
1.countとKcountが同時に上がらない原因については,理解できましたか?
すいません、どうか教えてください。
2.1が理解した上で,framesを1度だけ足せばいいというのはわかりましたか?
framesが一度だけ足せばいい理由は、Kcountでcountのframesを利用すれば良いと思うのでなんとなくわかります。
3.2の具体的な方法がわからないのでしょうか?
はい、理解したいのですが詳しい方法はわからないです。
どうかよろしくお願いいたします。
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.43 ) |
- 名前:どん 日時:2019/10/07 18:14
もとのプログラムにおいて,countとKcountが同時に上がらない理由は,framesが
if(frames % 5 == 0)とif(frames % 20 == 0)のときで値が変わってしまっているからです
下のプログラムにおいて,count=0,Kcount=0,frames=19とします
下のプログラムを実行すると,各変数は次のように変化します
if(count < 50) ++frames; //count=0,Kcount=0,frames=20
if(frames % 5 == 0) { //framesが20なので条件を満たす
++count; //count=1,Kcount=0,frames=20
if(count > 50) { //countが50以下なので満たさない
count = 50;
}
}
if(Kcount < 50) ++frames; //count=0,Kcount=0,frames=21
if(frames % 20 == 0) { //framesが21なので条件を満たさない
++Kcount;
if(Kcount > 50) {
Kcount = 50;
}
}
countとKcountは同時に上昇したいので,上の状況のときにはcountとKcountが
1になるのが望まれますが,実際には,countしか1になりません
if(frames % 5 == 0)とif(frames % 20 == 0)の前で値が変わってしまっているからです
framesが20の倍数のときは,1行目でframesが21に変わってしまうので,if(frames % 20 == 0)
は満たされず,同時に2つの変数が上がれないのです.
もし,これについて理解できなければ,かんたんなプログラムを作って,printfデバックやら,デバッガ
なりで,理解してください.
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.44 ) |
- 名前:マーク42 日時:2019/10/07 23:17
わざわざどうもありがとうございます!
少し理解出来てきました。ですが、少し疑問があります。
もとのプログラムにおいて,countとKcountが同時に上がらない理由は,framesが
if(frames % 5 == 0)とif(frames % 20 == 0)のときで値が変わってしまうためでありますが、
count=0,Kcount=0,frames=18とした場合、確かにcountとKcountが同時に上がることはないですが
Kcountは以下のようになるので同時に上がらないだけでKcountは上がると考えたのですが、どこが間違っているでしょうか。
if(count < 50) ++frames; //count=0,Kcount=0,frames=19
if(frames % 5 == 0) { //framesが20なので条件を満たす
++count; //count=1,Kcount=0,frames=19
if(count > 50) { //countが50以下なので満たさない
count = 50;
}
}
if(Kcount < 50) ++frames; //count=0,Kcount=0,frames=20
if(frames % 20 == 0) { //framesが20なので条件を満たさない
++Kcount;
if(Kcount > 50) {
Kcount = 50;
}
}
出来が悪くてすいません、、、。
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.45 ) |
- 名前:どん 日時:2019/10/08 18:01
>>if(frames % 5 == 0) { //framesが20なので条件を満たす
?このときはframesはまだ19なので,満たしませんよ
>>if(frames % 20 == 0) { //framesが20なので条件を満たさない
このときは,framesは20で,frames % 20は0になるので,条件を満たします
>>Kcountは以下のようになるので同時に上がらないだけでKcountは上がると考えた
同時に上がるのが目的だったのでは?
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.46 ) |
- 名前:Tatu 日時:2019/10/08 18:50
(1)以下のコードを実行して結果を見てください。
(2)int frames = 1;をint frames = 0;にしてもう一度実行し、結果を見てください。
#include <stdio.h>
int main() {
int frames = 1;
int count = 0;
int Kcount = 0;
while (count < 50) {
printf("frames=%d,count=%d,Kcount=%d\n", frames, count, Kcount);
if (count < 50) ++frames;
if (frames % 5 == 0) {
++count; if (count > 50) { count = 50; }
}
if (Kcount < 50) ++frames;
if (frames % 20 == 0) {
++Kcount; if (Kcount > 50) { Kcount = 50; }
}
}
printf("frames=%d,count=%d,Kcount=%d\n", frames, count, Kcount);
return 0;
}
|
Re: 元のマスに戻ったあと前のマスに行けない ( No.47 ) |
- 名前:マーク42 日時:2019/10/08 19:50
返信ありがとうございます。
はい!同時に上がるのが目的です。
ですので以下のように考えました。
0,1,2,3,4,,,frames=5の時、if(frames % 5 == 0)を満たし、6,7,8,9,frames=10の時、if(frames % 5 == 0)を満たし、
11,12,13,14,frames=15の時、if(frames % 5 == 0)を満たし、16,17,18.19.frames=20の時、if(frames % 20 == 0)を満たします。
この時点でcountは3、Kcountは1となると考えたのですが、実際は同時に上がらないのでcountは3、Kcountは0です。
ですが、なぜそうなるのか理由がわからないです。
同じことを聞いているようですいません。
|