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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

2470閲覧

elseとif文について

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/05/22 19:56

編集2020/05/22 23:40

javasilver se8 黒本 3章問17

class Main{ public static void main(String[] args){ int num = 10; if(num == 100) System.out.println("A"); else if(10<num) System.out.println("B"); else if(num==10) System.out.println("C"); else if(num==10) System.out.println("D"); } }

擬:なぜ1番下のif文は下から2個目のif文と同じ条件式で必ずそこへは行けないようになっているのに
実行不能コードがある:コンパイルエラーとならないのか

答:maisumakunさんが張ってくれたurl参照。

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

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

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

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

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

BluOxy

2020/05/22 20:16 編集

インデントがこちらからは見えず非常に読みづらいので、質問を編集し、添付したコードを```で囲んでください
BluOxy

2020/05/22 20:18

> class Mian{ Main ではないでしょうか > Sytem.out.println("B"); SytemではなくSystemではないでしょうか。これではコンパイルエラーになります。 添付されたコードを元に回答者は問題を検証します。なので、意図したコードを貼れていない場合は正しい回答が得られない可能性が高くなります。実際のコードをコピーし、そのままの形で質問に添付するようお願いします。
m.ts10806

2020/05/22 20:23

Silver受験しようとしている人が自分で動かせる環境もないんでしょうか。 プログラムは実際に動かさないと理解は深まらないですよ。
BluOxy

2020/05/22 22:55

質問が解決したようでしたら、ベストアンサーを選択して質問のクローズをお願いします。
退会済みユーザー

退会済みユーザー

2020/05/22 22:56

bluoxyさん。そうですね。もう少し有用な情報が得られるかと思い開けてたんですが閉めますね回答ありがとうございました。
BluOxy

2020/05/22 23:31 編集

質問に添付されているコードはMarkdown( https://teratail.com/help#about-markdown )を適用して、コンパイルが通る形に修正して頂きたいです。 他のユーザーが参考にする可能性も 0 ではありませんから、ご協力をお願いします。
BluOxy

2020/05/24 15:59

退会してしまいましたが、対応ありがとうございました。
guest

回答4

0

ベストアンサー

このコード絶対に"D"いけないためコンパイルエラーだと

思っていたのに

とは限りません。というより、「絶対にたどり着けないコード」を完全に検知することは不可能です。

投稿2020/05/22 22:05

maisumakun

総合スコア145192

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

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

maisumakun

2020/05/22 22:07

この場合はローカル変数なので起きないとは思いますが、プロパティ参照をしている場合、1つ目のelse ifの判定と2つ目のelse ifの判定の間に、プロパティが別スレッドから書き換えられる、という可能性も考えられます。 つまり、「else ifに同じ式がある」という条件からは、「片方が実行不能コードになる」ということは確定しません。
退会済みユーザー

退会済みユーザー

2020/05/22 22:16

プロパティが別スレッド?ちょっとかみ砕いて教えていただけませんか?
maisumakun

2020/05/22 22:20 編集

Javaはマルチスレッドで動く言語なので、複数のプログラムが並行して動くようになっています。そのため、1回目のifの判定と2回目のifの判定の間に、別な処理が動作する可能性もあります。
退会済みユーザー

退会済みユーザー

2020/05/22 22:24

そんなプログラムってすっとろいんですか?
退会済みユーザー

退会済みユーザー

2020/05/22 22:26

うわーすごい見たかったページドンピシャですありがとうございます。bluoxyさんにも感謝していますがベストアンサーとさせていただきます
maisumakun

2020/05/22 22:26

「競合状態」といって、現実にセキュリティの問題となります。
maisumakun

2020/05/22 22:26

最終的には、仕様書がいちばん確実です。
退会済みユーザー

退会済みユーザー

2020/05/22 22:34

ifないが定数だったら到達できなくて変数だったら到達できるとかあるんすね。ちょっと広がりました
BluOxy

2020/05/22 22:41

2020/05/23 07:24 の maisumakun さんの引用した部分がこの質問のポイントですね。 私も言語仕様について勉強になりました。
guest

0

落ち穂拾いの回答です。

このコード"D"いかなくてコンパイルエラーだと

思っていたのに答えは"C"でした。なぜでしょうか。

これは実にナンセンスな質問です。

人間が「このコードがコンパイルエラーにならないのはなぜか?」「エラーになるコードではないのはなぜか?」に回答しようとすると、

  1. Javaの文法に則っていること
  2. コンパイル時点で検出されるすべての意味論的エラーのどれにも該当しないこと

を全部確かめて説明する必要があります。
そんな馬鹿な話はありません。
すでに回答に付いているとおり、コンパイルしてみればいいのであって↑を人間がやる必要も無いし、実際問題として不可能です。

投稿2020/05/22 21:10

quickquip

総合スコア11042

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

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

退会済みユーザー

退会済みユーザー

2020/05/22 21:35

補足させてもらいます。 なぜ"D"に行けないと思ったかと言いますと、"D"は"C"と全く同じ条件式のif文がたっているからです。 人間がやる必要がないと言ってますけどjavasilverの問題にもコンパイルエラーになるのはなぜかと言った問題が存在します。不可能だとかコンパイルすればわかるって解答してはいけないのです。
退会済みユーザー

退会済みユーザー

2020/05/22 21:46

つまり私がナンセンスなのではなくあなたがナンセンス 不可能ではなく’あなた’が出来ないだけ。
BluOxy

2020/05/22 22:04 編集

> 不可能だとかコンパイルすればわかるって解答してはいけないのです。 回答をする前に、事前に sai3131 さんの考えた仮説が正しいか検証する必要があります。 間違っている仮説から正しい答えは導き出せません。 >このコード絶対に"D"いけないためコンパイルエラーだと思っていた これが仮説です。仮説は実際に試して正しいかどうかを検証してください。 検証は検証、回答は回答です。 「答えは"C"でした。なぜでしょうか。」に対する回答は、私の回答にあります。 他のユーザーも回答してくれるかもしれません。
maisumakun

2020/05/22 22:04

試験問題である以上、理詰めで考える必要があるのです。
m.ts10806

2020/05/22 22:25

>javasilverの問題にもコンパイルエラーになるのはなぜかと言った問題が存在します それは別の設問であって、今回は「何が出力されるか」というのを答える設問です。 単に「先に満たすからCが出る」とだけでおさめることはできませんか?
maisumakun

2020/05/22 22:28

> 今回は「何が出力されるか」というのを答える設問です。 明確に書かれていませんが、選択肢に「コンパイルエラーになる」が入っていたのかも知れません。
退会済みユーザー

退会済みユーザー

2020/05/22 22:28

m.tsさんの依頼イヤミったらしくて無視していたんですが割と普通なんですね回答ありがとうございます。 納めてみようと思います。
退会済みユーザー

退会済みユーザー

2020/05/22 22:29

入っていました流石ですね
m.ts10806

2020/05/22 22:34 編集

sai3131さん >割と普通なんですね 「そこにあるコードを動かしてみないの?動かしてみればわかるじゃん。」と思わない人はいません。動かせば質問する必要もなくなる可能性もあります。書いた通りにしか動かないから。 それに書いてないことは誰にも伝わりません。他人だから。 赤の他人ゆえ無視する人が多い中、指摘してもらえるだけマシです。 maisumakunさん 書いてあることが我々他人には全てですからね。
m.ts10806

2020/05/22 22:37

>赤の他人ゆえ無視する人が多い中 この根拠は「VIEW」の数値です。 延べ人数なので正確な「個人のカウント」ではないですが、 それなりに見られているのは確かですからね。
退会済みユーザー

退会済みユーザー

2020/05/22 22:39

m.tsさんへ まあそれは確かにそうかもしれませんがクソコメならしないでもらった方がましです。 煽ってるわけではないですけど、質問からその先を想像できたmaisuさんとm.tsさんには差があると思いますよ。本当に図々しいですが書いてあることの先を読んでください人間なんだから。
退会済みユーザー

退会済みユーザー

2020/05/22 22:40

って私もイヤミったらしいですね、ちょっと自分が嫌いになりました
m.ts10806

2020/05/22 22:47 編集

>質問からその先を想像できたmaisuさんとm.tsさんには差がある 正しくコードを書き写せてもないのに、そこで比較できるような立場ではないでしょ。 「調べてないのに質問する人」と「調べたけど書かずに質問する人」の区別は誰にもつけられませんよ。付けられます? 書いてないのに。 あなたは「技術系質問サイトで質問するんだから調べてから質問したに決まってんだろ」って逆切れする人と変わりません。 本当に全く調べず試さず質問する人の方が多いんですよ。 赤の他人にエスパーを強いるのは良い質問ではありません。 なので、ここまでこじれます。ちゃんと書いてればもっと早く的確な回答がついて解決してます。
m.ts10806

2020/05/22 22:47

>ちゃんと書いてればもっと早く的確な回答がついて解決してます。 訂正。投稿前に解決します。
退会済みユーザー

退会済みユーザー

2020/05/22 22:48

まあたしかに。私の最初の質問が悪かったのは自明です。例え上手いですねちょっと笑っちゃいました。まあ私はその例え通りのことを言ったと自覚を持っていったんですがね。
m.ts10806

2020/05/22 22:49

話し相手や遊び相手欲しいなら他所へどうぞ。
m.ts10806

2020/05/22 22:51 編集

それに質問内容について指摘されているのですから、修正すれば良い話。せずに噛みつくのはただの傲慢です。 とても理解したい、解決したい人の言動には見えません。
退会済みユーザー

退会済みユーザー

2020/05/22 22:53

いやいやよそへ行けってこっちのセリフなんですが。ちょっとコミュニケーション能力が低いんだと思いますよ自覚あると思いますけど。返してほしくないならコメントしなきゃいいじゃないですか。
退会済みユーザー

退会済みユーザー

2020/05/22 22:54

もう解決しましたよ。ちゃんと全体を見てください視野が狭いですね。
m.ts10806

2020/05/22 23:09 編集

全体見ようにも「コンパイルエラーになる」以外を選びようがないコードを提示した状態のままで何を見ろと。 「ってコードがjavasilverでありました」だけで、何を参照すればこのコードが見れるのか分からない状態です。 問題集だったとしても1種類ではありません。8か11でも違うでしょう。 もし、提示されたコードの通りが問題集に提示されているのならそれはそれで出版元に訂正依頼を出さないと同じ書籍を使う人が「コンパイルエラーになる」と本来の回答解説と間違った答えを選び、間違った認識で覚えてしまうことになります。問題集としての価値もなくなりますし、技術書としても参考にできません。 実際の試験問題だったらさらに問題ありですね。 この内容でお金とっているなら訴えなければならないレベルです。 BluOxyさんも「実際のコードをコピーし、そのままの形で」と依頼しています。でも修正されないままです。BluOxyさんから「動くようになったコード」をもらって自己満足で終わっていることになります。 この質問自体が何のためにもならないということにもなります。 折角のmaisumakunさんのリンクもコメントで埋もれて切り取りづらくなっています。 「私の最初の質問が悪かったのは自明です」と仰るのでしたら、せめてコードだけでもちゃんと書き写しませんか?(もちろんteratailでコード提示するならマークダウンは必須です)
BluOxy

2020/05/22 23:17 編集

間違えて回答のコメントに書いてしまったので削除
退会済みユーザー

退会済みユーザー

2020/05/22 23:24

わかりましたよ~書き直すからマークダウンが何か教えてください
m.ts10806

2020/05/22 23:33 編集

一番最初のBluOxyさんの指摘にもやり方は書いてありますし、08:17にも「追記修正依頼」にコメント投稿されています通り、 ヘルプページにも「マークダウンとは何か」があります。 その手の質問もそれなりに上がっていますし私も回答したことがあります。 Javaの仕様確認のためにドキュメントを参照するのと同じです。 探してやってみて出来なければまた聞くと良いです。質問するときと同じ。 癖づけるために、まず探してみては? ここまで魚を求める人がSilver通るとは思えませんが・・・。(受験するつもりで勉強しているかは知らないけど)
退会済みユーザー

退会済みユーザー

2020/05/22 23:35

m.ts お前ってホントに一言余計だよね。気持ち悪いな。
退会済みユーザー

退会済みユーザー

2020/05/22 23:36

君でもseやれてるんだし(きっと嫌われてるけど)だれでもやりたいことできるんじゃない?
m.ts10806

2020/05/22 23:37

礼儀もプログラミングに対する学習姿勢も全くない人に言われる筋合いはありません。
m.ts10806

2020/05/22 23:41 編集

悪いですが仰るような低次元で仕事はしていません。 赤の他人に対する厚意の場で仕事レベルの知識技術をフル動員することのほうが少ないですよ。そういう質問は殆ど上がらないですし、むしろそういう質問は質問では済まないので然るべき対価を払って依頼すべきでしょう。
退会済みユーザー

退会済みユーザー

2020/05/22 23:43

いや、君以外にはしっかりとお礼も言ってるよ。 それは君の価値観でしょ。押しつけが激しい人だね。だから嫌われてるんだよ。
m.ts10806

2020/05/22 23:49

本回答は「quiquiさん」ですがお忘れですか。 「だから嫌われる」という個人的価値観を押し付けられても困りますが、 プログラミング言語のコンパイラーは好みでは振り分けないですから、好きとか嫌いとか思ってるとかじゃなく書いた通り動く。それだけ。 書いてないことまでエスパー強いる人はプログラミングで苦労します。そういう初心者から抜け出せない人、teratailでわんさか見てきました。そういう人に嫌われようと痛くも痒くもない。 「この人は成長しないだろうな」という評価は変わりません。 言わないだけで思ってる人は多いでしょう。ちゃんと指摘する人と言わずに放置する人、どちらが成長には必要か熟考したうえで発言してください。別に他人故にどうなろうと知ったこっちゃない、強制するつもりはないので、あとは自分がどうなりたいかで、どうぞ。 teratailも1つのツールです。活用の仕方を間違えば時間の浪費にしかなりません。
退会済みユーザー

退会済みユーザー

2020/05/22 23:57

いるよね。親切心で言ってるとか思っちゃってる人。ただのエゴであり需要もないからね? ほんとに大きなお世話なんですよ。私からしたらあなた目指してるわけじゃないんで急に評価されても気持ち悪いなくらいしか思わないですしね。絶対に貴方みたいな恩着せがましいやつになりたくないし、ちょっと否定されたら顔真っ赤にして怒っちゃうm.tsさんみたいなキッズにはなりたくないんです。反面教師お疲れさまでした
Zuishin

2020/05/22 23:59

現時点でちょっと否定されたら顔真っ赤にして怒っちゃうキッズかと思ってました。
quickquip

2020/05/25 00:19 編集

「コンパイルエラーになるかならないかが(感覚として)分かる」のと「コンパイルエラーにならない理由を述べる」のとでは話が全然違います、という回答ですよ。 前者は普通のプログラマでもコンパイラに通さなくてもまあまあ判断できるけど、後者は普通のプログラマにはできないでしょう? ということを書いただけです。 あなたが(元の質問で表面上)求めたのは後者。
guest

0

コードがjavasilverでありました。このコード"D"いかなくてコンパイルエラーだと

思っていたのに答えは"C"でした。なぜでしょうか。

コンパイルエラーになるかどうかは試しに実行してみましょう
Javaの開発環境が整っていなくても大丈夫です。実行だけであれば Java をWeb上で実行するサービスがあるので、そちらを使うと良いでしょう。

一番下のelseは取り敢えず入ってしまうものなんですか?有識者お待ちしております。

追記に書いたコンパイルエラーを除いて、正しく動くものと想定します。
出力されるのは C なので一番下の else if(num == 10) の条件判定はされていません。
一つ上のまったく同じ条件である else if(num==10) が真と評価され、C が出力されています。

詳しくはリファレンスか教材に記載されているifelse ifelse の解説を再確認してください。

投稿2020/05/22 20:26

BluOxy

総合スコア2663

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

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

退会済みユーザー

退会済みユーザー

2020/05/22 21:59

すみません!動かせる環境はあります!ご丁寧な回答ありがとうございます。 一番下のIFの条件式って下から2個目の条件式と一緒じゃないですか。 で、絶対に通らない部分っていうのがあるとプログラムはコンパイルエラーが起きると存じていたのでこれはなんで起きないんだろーっといった感じです。 コンパイルすればわかるじゃんって話なんですけど、試験ではなぜそうなるか。理由を知っていなきゃならないので。
BluOxy

2020/05/22 22:02 編集

> 絶対に通らない部分っていうのがあるとプログラムはコンパイルエラーが起きると存じていた これは、どこを情報源にしているのでしょうか。リンクか何かを貼っていただけますか。 私は sai3131 さんの仮説だと認識しています。
退会済みユーザー

退会済みユーザー

2020/05/22 22:11

web見た感じこれが思ってたやつに一番近いかも
退会済みユーザー

退会済みユーザー

2020/05/22 22:15

仮説だと認識しないでください。
BluOxy

2020/05/22 22:16

添付されたコードを書いて、実際に「到達不能なステートメント」エラーが再現するかを検証すれば、その仮説が正しいかどうかを確認できます。 再現しなければ、理由はどうであれ、仮説が間違っているということになります。
退会済みユーザー

退会済みユーザー

2020/05/22 22:19

いやだからエラーかどうかコンパイルで検証するとかの話じゃなくってなんでそうなるか知りたいって言ってるんです
BluOxy

2020/05/22 22:19

添付頂いたページを見る限りでは、メソッドの処理中に`return`ステートメントが入っています。 この場合は「到達不能なステートメント」エラーが再現すると読めました。 ・メソッドの処理中に`return` ステートメントを挟んだケース → この場合は再現する ・同じ条件を二つ持った`if/else if`による分岐処理を作成したケース → ? 上記2点はそれぞれ状況が違うので、同じように頭で当てはめてはいけません。 検証する必要があります。
BluOxy

2020/05/22 22:20

> なんでそうなるか知りたい コンパイルエラーにはなりません。そうならない認識なので、理由は書けません。
退会済みユーザー

退会済みユーザー

2020/05/22 22:22

ちょっと求めていた解答と違いますが、ここまで相談乗ってくれて大変感謝しております。ありがとうございました。
退会済みユーザー

退会済みユーザー

2020/05/22 22:23

まあそれは確かにそうですね
guest

0

一回、「どういう書き方をすると到達不能コードになるか」のあらゆるパターンを説明でき、かつ到達可能なコードに対して誤判定しないフローチャートを考えてみてください。
例えば、あなたが考えるような「if-else ifの中で全く同じ条件式の場合はたどり着かない」とした場合、次のコードでは本来到達できるはずなのに到達できないと判定されてしまいます。

java

1int num = (何らかの入力); 2if (num++ > 10) { 3 //do something 4} else if (num++ > 10) { // 到達不能?いいえ、可能です。 5 //do something 6}

投稿2020/05/24 00:39

swordone

総合スコア20651

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

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

退会済みユーザー

退会済みユーザー

2020/05/24 06:54

フローチャートの他にもnullpointerexceptionがでる場合の条件なども詳しく調べてみようと思います。アドバイスありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問