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

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

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

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

Q&A

解決済

1回答

628閲覧

平成30年基本情報秋java

himazin392

総合スコア7

Java

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

0グッド

0クリップ

投稿2022/07/18 09:21

平成30年秋の問11javaについて質問

平成30年秋の問11javaの設問2とTemplateparserクラスのswitch文について質問です
リンクです。
https://www.fe-siken.com/fekakomon_pm.php

一つ目のjavaの設問2から質問させていただきます。

質問1

なぜ、ウの選択肢である(char )c では現在読み込んだ\の右側だけ格納できるのに対して、オの選択肢であるreader.read()ではその次の一文字を読み込むことができるのでしょうか。
抽象的過ぎてわかりづらく申し訳ありませんが、意味としては

プログラム4TemplateParserクラスの一部分

int c; while ((c = reader.read()) >= 0) {// 質問1について switch (c) {//質問2について case '<' : fragmentList.add(new b ); buf = new StringBuilder(); break; case '>' : fragmentList.add(new c ); buf = new StringBuilder(); break; default : buf.append((char) c); } }

プログラム4からwhile((c=reader.read())のc=reader.read()の部分は
代入演算子が使われているのでreader.read()はcと同じ値を意味していると思い、
ウとオの出力結果は同じだろうと考えてしまいました。
reader.read()は\の部分に加えて、その次文字の'<'や'>'などはどうやって読み取れるているのかがよくわからないです。この場合はエスケープシーケンス?の仕様なのでしょうか

質問2

先ほどのswitch(c)の部分ですが、cはint型に対して、switch文の選択肢のcaseは’<’などchar型となっております。
この場合はint型であるcは char型にキャスト変換されてからswitchが実行されるのでしょうか。
おそらくASCIIコードの数からchar型に対応した番号を読み取ってから実行されているのかと思うのですが。
何卒ご回答の程を宜しくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

・質問1について:
FileReader.read()は、ファイルから1文字読み込み、その値をintで返すとともに、内部の現在位置を1つ進めるから。

ループの最初の
while ((c = reader.read()) >= 0)
の時点で、cには現在位置の文字に対応するintの数値が入る。
そして内部で現在位置が1つ進められる。

続いてcが

case '\\'(=「\」)

にマッチしたとき、
buf.append((char) reader. read());
を実行することで、1つすすんだあとの位置の文字、つまり\の次にある文字を読み取ることになる。
(そのあとbreakが必要なのはほかのcaseと同じ)

・質問2について:
charは暗黙にintに型変換できるから。

switch (c) { case '<': ... }

で cが'<'とマッチしているか判定されるときに、'<'はintに暗黙に型変換されてcと比較される。

投稿2022/07/18 10:07

編集2022/07/18 10:10
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

himazin392

2022/07/18 10:28

質問1についてのコメントです。 つまりwhile内にある現在位置は\\の内の左側の\としたときに、cに代入されてからread()によって右側の\に移動するのでしょうか。 その後、switch文内にあるread()が実行されたときに現在位置が一つ移動して初めて'>'などがappend()によって文字が結合されるのでしょうか?
退会済みユーザー

退会済みユーザー

2022/07/18 12:16 編集

「つまりwhile内にある現在位置は\\の内の左側の\としたときに、cに代入されてからread()によって右側の\に移動するのでしょうか。」 まず、問題本文のおさらい。 プログラムのおおもとの目的は ・<名前>や<金額>のように「<」や「>」で囲まれた部分を、置き換え用の文字列として認識させる というものです。 で、「<」や「>」が来たときは特別な処理を行うように、SWITCH CASE文で分岐させてるわけです。 それでは続いて、設問2の問題 「 < と > は,置換指示としてキー名称を囲う用途以外では,ひな形中で使用することができない。 そこで,これらの文字を他の用途でも使用できるように, 次の2行をプログラム4のクラス TemplateParser の α の位置に挿入した。 これによって,\ に続く1文字( \ が複数個連続するときは奇数個目に続く1文字)は, 置換指示以外の部分やキー名称の一部として扱われる。 ここで,続く1文字は必ず読めるものとする。」 つまり、ファイル中に置き換えとは関係なく「<」や「>」という文字を普通に文字として使いたくても、今のままだと特別な区切り文字として扱われてしまって、使えないんで、 そういう場合(=「<」や「>」という文字を普通に文字として使いたい場合は)「\」記号に続けて「<」や「>」という文字をファイルに書いて対応できるようにしよう、というのが設問2の趣旨です。 たとえば「\<」という2文字が書かれたファイルがあるとします。 while ((c = reader.read()) >= 0) の部分で、ファイルからまず読み込まれるのは1文字目「\」です。 cには「\」に対応したintが帰ります。 (そしてreader内部で、次の読み取り位置は2文字目にセッティングされます) case '\\' の部分で、コード上で「\\」となっている部分は、実行時には「\」として比較されます。 つまりcase '\\':の部分は、実行時には「『\』という文字とマッチするか?」という比較がなされるんです。 (これはcase '\': と書いてしまうと、 コンパイラは 引用符が閉じてないと解釈してエラーになってしまうからです. なぜなら\' は、エスケープシーケンスでコンパイル時に「'」という文字そのものとして解釈されるからです。また\\は同様にエスケープシーケンスで「\」という1文字として解釈されます。) そして、マッチした場合 buf.append((char) reader. read()); で、先ほどセッティングされた2文字目「<」が読み込まれ、「<」に対応するint値が帰り、そのint値がcharに変換されて、bufに追加されます。 結果bufは「<」という1文字になります。 -------------------------------------- まとめるとこうです。 ①ファイルから左側(1文字目)の「\」がまず読み込まれて「\」に対応する値がcに格納される ↓ ②case '\\'の部分で「\」にマッチするので buf.append((char) reader. read()); が実行される。 ↓ ③この reader. read()の部分で、右側(2文字目)の「<」が読み込まれて、int値がcharにキャストされ、bufに追加される。 ↓ ④結果、bufは「<」一文字となる。 -------------------------------------- ・仮に読み込むファイルの内容が「\\」 となっていた場合の挙動は、以降のとおりです ①ファイルから左側(1文字目)の「\」がまず読み込まれて「\」に対応する値がcに格納される ↓ ②case '\\'の部分で「\」にマッチするので buf.append((char) reader. read()); が実行される。 ↓ ③この reader. read()の部分で、右側(2文字目)の「\」が読み込まれて、int値がcharにキャストされ、bufに追加される。 ↓ ④結果、bufは「\」一文字となる。
himazin392

2022/07/18 13:28

ご丁寧な質問をありがとうございます。理解ができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問