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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

5回答

3169閲覧

if文に関してのif文の使い方の質問。

DR.Dexter00

総合スコア18

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

4クリップ

投稿2019/09/09 10:21

編集2019/09/10 09:20

以下のプログラムのif文に関してなのですが、

if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) { lock = 1; lockonMove = 1; } if (lockonMove > 0) { ++lockonMove; } if (lockonMove == 10) { lockImge = lockonHandle[0]; } else if (lockonMove == 20) { lockImge = lockonHandle[1]; } else if (lockonMove == 30) { lockImge = lockonHandle[2]; } else if (lockonMove == 40) { lockImge = lockonHandle[1]; lockonMove = 1; } if (playerY != enemyY) { lock = 0; lockonMove = 0; }

if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) { lock = 1; lockonMove = 1; if (lockonMove > 0) { ++lockonMove; } if (lockonMove == 10) { lockImge = lockonHandle[0]; } else if (lockonMove == 20) { lockImge = lockonHandle[1]; } else if (lockonMove == 30) { lockImge = lockonHandle[2]; } else if (lockonMove == 40) { lockImge = lockonHandle[1]; lockonMove = 1; } if (playerY != enemyY) { lock = 0; lockonMove = 0; } }

のプログラムは何がどう違ってくるのでしょうか。

解きながら学ぶC言語で基礎問題を解いてみたのですが、どうしても以下のことがわかりません。

if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) { lock = 1; lockonMove = 1;    //この時点でRを押して、playerY == enemyYと条件が揃っているので真となり、 //lockonMove = 1より、++lockonMoveとなると思ったのですが。このプログラムではlockonMoveは2にしかならないということでしょうか。 if (lockonMove > 0) { ++lockonMove;//ここではlockonMoveは2にしかならないということでしょうか。だとしたら、なぜもう一つのプログラムはループされて+1ずつされるのでしょうか。 } if (lockonMove == 10) { lockImge = lockonHandle[0]; } else if (lockonMove == 20) { lockImge = lockonHandle[1]; } else if (lockonMove == 30) { lockImge = lockonHandle[2]; } else if (lockonMove == 40) { lockImge = lockonHandle[1]; lockonMove = 1; } if (playerY != enemyY) { lock = 0; lockonMove = 0; } }

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

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

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

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

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

gentaro

2019/09/09 10:26

まずインデント揃えましょう
Zuishin

2019/09/09 10:27

if 文の文法がわからないということなら、まず入門書を読んでください。
DR.Dexter00

2019/09/09 10:36

はい、もう一度 読み直します。ありがとうございました。
fana

2019/09/09 10:48

(複垢?)
cateye

2019/09/09 10:48

gentaroさんの言うように、インデントを揃えれば一目瞭然です。 ソースは対応するカッコで判断できます。・・・確認しましょう
DR.Dexter00

2019/09/09 10:50

複数のアカウントは作っていません。ここで質問している方のプログラムで気になったものをピックアップして質問しました。ややこしいことしてしまいすみません。
gentaro

2019/09/09 11:01

謝罪とかどうでもいいのでインデント揃えましょう。 if文を一度でも学んだことがある人なら、それだけで「違い」はわかります。 フォーマットを揃えるのは整理整頓をするのと同じです。 ご自身のためにもなります。 フォーマットができていない(インデントの揃っていない)コードを他人に見せるというのは、丸めたティッシュやコンビニ弁当の容器が散らばった部屋を他人に見せるぐらい恥ずかしい事だと思ってください。
Zuishin

2019/09/09 11:22

もしかして、インデントのそろえ方がわからない人ですか?
DR.Dexter00

2019/09/09 11:27

これでどうでしょうか。
Zuishin

2019/09/09 11:33

そろってるように見えますか?
DR.Dexter00

2019/09/09 11:48

見えます。と思います。
Zuishin

2019/09/09 11:50

メモ帳ではなく、自動的にインデントをそろえる機能がついているエディタを使いましょう。 これがそろってるように見えるのなら、人力でそろえるのは無理です。
DR.Dexter00

2019/09/09 11:51

わかりました。探してみます ありがとうです。
Zuishin

2019/09/09 12:03

carnage0216 さんへのおすすめは Visual Studio Code です。 インストールしたら後はほぼ何もしなくても最初から使える状態になります。
DR.Dexter00

2019/09/09 12:05

ん? その方と同じものを使えば良いのですね。 ありがとうございます
Zuishin

2019/09/09 12:06

あなたのことですよ。なぜわからないと思えるんですか?
cateye

2019/09/09 12:07

個人的にお勧めはNotepad++ windows版→https://forest.watch.impress.co.jp/library/software/notepadplusp/
DR.Dexter00

2019/09/09 12:08

本当に知らない人なんですが、その人の書いたプログラムをピックアップしたのが不味かったのかな。 なんにしてもそのcarnageなんとかという人は知りません。
cateye

2019/09/09 12:13

質問する前に実行だけではなく、みなさんが言われているように、ソースを整形しておかしなところを見つけましょう。
Zuishin

2019/09/09 12:21

ピックアップって、if 文もわからない人がこのコードを補完して実行できるわけないじゃないですか。 そこまで下手な嘘で騙せるバカと思われているのは不愉快です。
gentaro

2019/09/09 12:57

どうもインデントがよくわかってないみたいだから、できればちゃんと揃えてくれるエディタなり統合開発環境(IDE)を探すところから始めたほうが良さそう。 あとデバッガの使い方も勉強したほうが良い。(IDE使うならステップ実行とかできると思うけど) コードを眺めるよりも、具体的にどういうステップで処理がされているのか見る方が早い気がする。
DR.Dexter00

2019/09/09 13:08

皆さん、ありがとうございました。
fana

2019/09/10 01:31

> そこまで下手な嘘で騙せるバカと思われているのは不愉快です。 そう,なんかそんな感じなんですよね. (せめて変数名くらいは適当に変えておくとか,こう,他の話を装うのにも最低限の礼儀(←??)ってものがあるっしょ……)
DR.Dexter00

2019/09/10 09:09

ややこしいことしてしまいすみません。
Zuishin

2019/09/10 09:22

こんなにバレバレなのにまだバレてないつもりなんだ。 すごいな。 通報して IP 確かめてもらおうか?
cateye

2019/09/10 09:35 編集

Key[KEY_INPUT_R] == 1は本当に成り立っていますか? ’R'を押したら1になるというのは確認取れていますか? デバッグできないなら、各値をprintf() でも使って表示してみましょう。
DR.Dexter00

2019/09/10 10:00

Rはちゃんと押されています。
cateye

2019/09/10 10:45 編集

〉Rはちゃんと押されています。 押したらKey[KEY_INPUT_R]が1に成るのは確証取れていますか?
swordone

2019/09/10 10:54 編集

アホなこと書いた。削除。
guest

回答5

0

//(※質問者が提示したコードの先頭部分を抜粋した) if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) { lock = 1; lockonMove = 1;    //この時点でRを押して、playerY == enemyYと条件が揃っているので真となり、 //lockonMove = 1より、++lockonMoveとなると思ったのですが。このプログラムではlockonMoveは2にしかならないということでしょうか。 if (lockonMove > 0) { ++lockonMove;//ここではlockonMoveは2にしかならないということでしょうか。だとしたら、なぜもう一つのプログラムはループされて+1ずつされるのでしょうか。 } ...

上記の抜粋コードでは,
if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) の条件を満たしたとき

  • lockonMoveの値が1になります.(lockonMove=1; と書いてあるので.)
  • その次に,if (lockonMove > 0)の条件の判定が行われます.今,lockonMoveの値は1なので,条件を満たします.そうすると ++lockonMove; が実行されるので,値は2になります.

以上に関しては大丈夫でしょうか?
lockonMoveの値は1になった後,直後にすぐ2になるわけです.間髪入れずに(?) 結果は2になりますね.

さて,(このコード部分がループの中にあって,繰り返し実行されるような場合を想定すると)
次に if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) の条件を満たしたときには,上記の事柄がまた起こるわけです.結果として,lockonMoveは2になります.
何度やっても同じです.毎回上記の処理が実行されるわけですから,いつも2になります.

もう一つのプログラム

の側では,
if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) の条件を満たしたときにはlockonMove=1;が実行されますが,それはそれとして,
if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) の条件を満たしていなくても
if (lockonMove > 0)の条件の判定が行われ,その時のlockonMoveの値がこの条件を満たしていればlockonMoveの値がインクリメントされるわけです.

全く違いますよね.


変数lockonMoveに関係する部分についてフローチャートを簡単に描いてみました.
(Key[KEY_INPUT_R] == 1 && playerY == enemyY)という条件は図に書込むには長ったらしいので,下図ではこれを「条件1」と記述しています.
処理は一番上から始まって矢印の順で進んでいきます.
菱型がifに相当する処理分岐です.条件を満たす場合は下方向に,満たさない場合は右方向に処理が進みます.

差は一目瞭然かと思います.
右側のフローチャートでは,lockonMove=1;の処理を通らずに++lockonMove;の処理を通るフローが存在することがわかります.
処理の流れがわからない場合はこういうのを自分で描いてみて確認すると良いでしょう.
イメージ説明

投稿2019/09/10 10:45

編集2019/09/11 08:55
fana

総合スコア11658

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

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

fana

2019/09/10 10:53

(…という説明でわかるのならばそもそもこの質問をしないように思われるのがどうにも)
DR.Dexter00

2019/09/10 12:49

ありがとうございます。 if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) の条件を満たしていなくても,の言葉で少しわかってきました。 外にif文で新しく書かないと、+1をして2になるということを繰り返すばかりで意味がない、新しくif文を外に書くことで、if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) の条件を満たしていなくても+1を繰り返し足していくため、思った通りに動くわけですね。
fana

2019/09/11 01:18

一度,2つのコードのフローチャートを書いてみてはどうでしょう.違いが視覚的に明確になって良いのではないかと思います.
DR.Dexter00

2019/09/11 09:22

ご親切にどうもありがとうございます。
guest

0

ベストアンサー

2つのソースをインデント付けてみました。違いがわかりますか?

c

1if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) { 2 lock = 1; 3 lockonMove = 1; 4} 5if (lockonMove > 0) { 6 ++lockonMove; 7} 8if (lockonMove == 10) { 9 lockImge = lockonHandle[0]; 10 11} else if (lockonMove == 20) { 12 lockImge = lockonHandle[1]; 13 14} else if (lockonMove == 30) { 15 lockImge = lockonHandle[2]; 16 17} else if (lockonMove == 40) { 18 lockImge = lockonHandle[1]; 19 lockonMove = 1; 20} 21 22if (playerY != enemyY) { 23 lock = 0; 24 lockonMove = 0; 25} 26--------------- 27if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) { 28 lock = 1; 29 lockonMove = 1; 30 31 if (lockonMove > 0) { 32 ++lockonMove; 33 } 34 if (lockonMove == 10) { 35 lockImge = lockonHandle[0]; 36 37 } else if (lockonMove == 20) { 38 lockImge = lockonHandle[1]; 39 40 } else if (lockonMove == 30) { 41 lockImge = lockonHandle[2]; 42 43 } else if (lockonMove == 40) { 44 lockImge = lockonHandle[1]; 45 lockonMove = 1; 46 } 47 48 if (playerY != enemyY) { 49 lock = 0; 50 lockonMove = 0; 51 } 52}

投稿2019/09/09 11:46

cateye

総合スコア6851

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

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

DR.Dexter00

2019/09/09 11:48

if文の中にif文がある場合と if文と後にさらにif文が書いてあるとしか読み取れませんでした。
cateye

2019/09/09 11:52

if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) {のなかに if (playerY != enemyY) {が有るのって変じゃないですか?
DR.Dexter00

2019/09/09 11:56

変というか、if文で書いた後に、そのif文の条件を満たした上で新しいif文を実行していると考えていました。 if文の中にさらにif文を書くとどういう内容になるのですか?
cateye

2019/09/09 11:58

playerY == enemyYという条件のもとでplayerY != enemyYは成り立たないですよね?
DR.Dexter00

2019/09/09 12:06

確かに、言われれば。 だから、新しく外にif文を書いたのですね! わかりやすいです。
guest

0

それぞれどういう動作になるのかあなたなりに追いかけてみませんか。
それでもなお、違いがわからないでしょうか

投稿2019/09/09 11:32

y_waiwai

総合スコア87774

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

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

DR.Dexter00

2019/09/09 11:34

前者はちゃんと機能しますが、 後者は思った通りに機能しません。
y_waiwai

2019/09/09 11:38

そういうことです。 コードをみて、どこが違うかわかりますか
Zuishin

2019/09/09 11:44

> 前者はちゃんと機能しますが、 > 後者は思った通りに機能しません。 機能したということは、実行できたんですかこれ?
guest

0

意味のある字下げができないとこの仕事は向きません

C

1if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) { 2 lock = 1; 3 lockonMove = 1; 4 5 if (lockonMove > 0) { 6 ++lockonMove; 7 } 8 9 if (lockonMove == 10) { 10 lockImge = lockonHandle[0]; 11 12 } else if (lockonMove == 20) { 13 lockImge = lockonHandle[1]; 14 15 } else if (lockonMove == 30) { 16 lockImge = lockonHandle[2]; 17 18 } else if (lockonMove == 40) { 19 lockImge = lockonHandle[1]; 20 lockonMove = 1; 21 } 22 23 if (playerY != enemyY) { 24 lock = 0; 25 lockonMove = 0; 26 } 27}

1行目の [ と 27行目の ] のペアをわかるように表示してくれるエディタもあります。
意味のある字下げ

投稿2019/09/09 12:24

Orlofsky

総合スコア16415

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

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

0

とりあえず、インデントをそろえたものを提示します。
<code>をクリックして、「ここに言語を入力」をCにし、'''と'''の間にソースを入れてください。
そうすると、ソースのままのインデントが保たれます。
これで、どう違うのかが判るかと。

C

1 if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) { 2 lock = 1; 3 lockonMove = 1; 4 5 } 6 if (lockonMove > 0) { 7 ++lockonMove; 8 } 9 if (lockonMove == 10) { 10 lockImge = lockonHandle[0]; 11 12 } else if (lockonMove == 20) { 13 lockImge = lockonHandle[1]; 14 15 } else if (lockonMove == 30) { 16 lockImge = lockonHandle[2]; 17 18 19 } else if (lockonMove == 40) { 20 lockImge = lockonHandle[1]; 21 lockonMove = 1; 22 } 23 24 if (playerY != enemyY) { 25 lock = 0; 26 lockonMove = 0; 27 } 28

C

1 if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) { 2 lock = 1; 3 lockonMove = 1; 4 5 if (lockonMove > 0) { 6 ++lockonMove; 7 } 8 if (lockonMove == 10) { 9 lockImge = lockonHandle[0]; 10 11 } else if (lockonMove == 20) { 12 lockImge = lockonHandle[1]; 13 14 } else if (lockonMove == 30) { 15 lockImge = lockonHandle[2]; 16 17 18 } else if (lockonMove == 40) { 19 lockImge = lockonHandle[1]; 20 lockonMove = 1; 21 } 22 23 if (playerY != enemyY) { 24 lock = 0; 25 lockonMove = 0; 26 } 27 28 } 29

投稿2019/09/09 11:54

tatsu99

総合スコア5438

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問