質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

795閲覧

C# while文の条件式について

Tomo0225

総合スコア67

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/10/25 12:32

編集2020/10/25 13:07

C#

1do{ 2 targetplayer = originallist[UnityEngine.Random.Range(0,originallist.Count)]; 3 debugcount++; 4 Debug.Log("targetplayer"+targetplayer.PlayerName+" attacker "+attacker.PlayerName); 5 Debug.Log(targetplayer.Team+""+targetplayer.isLive+" "+attacker.Team+attacker.isLive); 6 if(debugcount > 50){ 7 Debug.Log("無限ループ"); 8 break; 9 } 10}while((targetplayer.isLive == false) || (targetplayer.Team == attacker.Team))

do while文で上記のような条件式を書いたのですが、targetplayer.isLive == trueで且つtargetplayer.Team != attacker.Teamのような条件の時でもwhile文から抜けずループしてしまうことがあります。
条件式の書き方でおかしいところがあるでしょうか?。

デバッグで確認したときの画像です。イメージ説明

分かりにくいですがdoの中身とデバックの結果を追記しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2020/10/25 12:57

実際にそのような動作をしている決定的な場面を提示できますでしょうか。 ループ文の中でConsole.WriteLineとか(Debug.WriteLineでもいいけど)でその変数の値を出力しつづけ、確実にループを抜けるはずなのになかったと判断できるエビデンスが欲しいです。
gentaro

2020/10/25 13:02

変数の値と併せて (targetplayer.isLive == false) と (targetplayer.Team == attacker.Team) の評価結果を出力した方がいいかも。 まぁ要するに「勘違いじゃない」という確認をどの程度しているのかわからんと、何とも言えない。
gentaro

2020/10/25 13:23

クッソわかりにくい… targetplayer.isLive == true targetplayer.Team == 1 attacker.Team == 2 の時に ((targetplayer.isLive == false) || (targetplayer.Team == attacker.Team)) を満たさないから抜けるはずが次のループへ進んでる、ということかな。 まぁそれなら確かにおかしい気はする。 bool b1 = !targetplayer.isLive; bool b2 = (targetplayer.Team == attacker.Team) として、ログにb1とb2の評価結果を個別に出し、 while (b1 || b2) という条件にしたらどうですか?
Tomo0225

2020/10/25 13:31

分かりにくくて申し訳ありません。読んでいただきありがとうございます。 条件式の中身を個別に評価してみるんですね。やってみたいと思います。
yudedako67

2020/10/25 13:59

もうひとつ、本当に抜けてないのか確認するためにループを抜けた場合に抜けたことがわかるようなログを出してみてほしいです。
guest

回答2

0

自己解決

皆さん回答ありがとうございます。
gentaroさんの
bool b1 = !targetplayer.isLive;
bool b2 = (targetplayer.Team == attacker.Team)
として、ログにb1とb2の評価結果を個別に出し、
while (b1 || b2)
として評価したら解決できました。
ありがとうございました。

投稿2020/10/25 14:59

Tomo0225

総合スコア67

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2020/10/25 15:13

解決したのならそれはいいんだけど、コメントした内容ではロジックは代わってないので、それだけで解決するはずないんだけど。 実際にログはどのようになり、何が原因で、どのような修正をしたんですか?
guest

0

|| という演算子は、かつ、ではなく、または、です。

VisualStudioを使ってるなら、ステップ実行させることができるので、その抜けない場合の条件式の値を確認してみてはどうでしょう

#カッコの数があわないのはよこにおいといて

投稿2020/10/25 12:37

編集2020/10/25 12:42
y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tomo0225

2020/10/25 12:47

回答ありがとうございます。 ||はまたはという意味なのは知っています。この場合、(targetplayer.isLive == true)と(targetplayer.Team != attacker.Team)の2つの条件を満たすときに繰り返し処理を抜けるようにしたいので||を使っています。 実際に処理中でDebug.Logを使って値を確認したのですがtargetplayer.isLive == trueでtargetplayer.Team != attacker.Teamの時でも抜けれないときがあります。 条件式以外のところに問題があるかもしれませんが....
y_waiwai

2020/10/25 12:58

具体的にどうLOGを出してどういう値を確認したんでしょうか そこんとこを提示しましょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問