HOME»基本情報技術者試験掲示板»平成30年秋問11(Java)設問2質問
投稿する

平成30年秋問11(Java)設問2質問 [4285]

 新人さん(No.1) 
平成30年秋問11(Java)の設問2について質問です。

設問2の解説を読むと、「case文にbreakを書かないと、(省略)、defaultの部分が処理され、\ の次の1文字を二重で buf に追加してしまうことになる」、と記載されています。

しかし、私の理解では「case文にbreakを書かないと、(省略)、defaultの部分が処理され、変数cに格納されている『\』をbuf に追加する」、と考えています。

私の理解でどこが間違えているのか教えていただきたいです。

例えば「\>」を処理する場合は、プログラム4のwhile文で変数cに「\」が代入されます。
そして、変数cはcase '\\'に該当するため、bufに\の次の文字(今回の場合「>」)を追加する。---(1)
ここまでは理解できます。

次は、case '\\'にbreakがないためdefaultに移り、変数cに格納されている「\」をbufに追加するのではないかと考えました。 ---(2)

case '\\' :
    buf.append((char) reader.read());      //   (1)「\」の次の文字をbufに追加、
                                                                                                                            //         breakがないためdefaultに移る
default :
    buf.append((char)c);                                                    //  (2)変数cには「\」代入されているためbufに「\」を追加?
2022.05.21 00:43
 新人さん(No.2) 
設問2では「オ」が正解だということは納得できています。
仮に選択肢「エ」を選んだ際の説明が理解できていないのです。
2022.05.21 01:06
GinSanaさん(No.3) 
FE シルバーマイスター
この投稿は投稿者により削除されました。(2022.05.22 23:03)
2022.05.22 23:03
GinSanaさん(No.4) 
FE シルバーマイスター
>設問2の解説を読むと、「case文にbreakを書かないと、(省略)、defaultの部分が処理され、\ の次の1文字を二重で buf に追加してしまうことになる」、と記載されています。
>しかし、私の理解では「case文にbreakを書かないと、(省略)、defaultの部分が処理され、変数cに格納されている『\』をbuf に追加する」、と考えています。

caseのバックスラバックスラに入って、仮にエならreader.readで現在地(バックスラの座標)の次の文字を読むわけで、次の文字がバッファに継ぎ足されて、defaultにフォールスルーして変数cの値がバッファに継ぎ足されるわけですよね。cの値ってreader.readで変わるんだっけ?と思いますが、実際にやってみましょう。
ひさびさにeclipseでやってみました。
test.txtには12345が書いてあります。
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
class streamTest1{
public static void main(String args[]){
try{
File file = new File("c:\\tmp\\test.txt");
FileReader filereader = new FileReader(file);
Reader tReader = filereader;
int c = 0;
while((c = tReader.read()) >= 0){
switch(c){
case '1':
System.out.print((char)tReader.read() + "\n");
default:
System.out.print((char)c + "\n");
break;
}
}
filereader.close();
}catch(FileNotFoundException Ignored){
}catch(IOException Ignored){
}
}
}

結果は
2
1
3
4
5
です。
つまり、初回のcは1で、tReader.read()で2が読まれて、元々のcの1が動いて、while((c = tReader.read()) >= 0){で読み直された段階の2回目のcは3になります。
2022.05.23 00:32
 新人さん(No.5) 
>GinSanaさん
ご回答いただきありがとうございます。

GinSanaさんのプログラム結果を見ると、設問2の解説「case文にbreakを書かないと、(省略)、defaultの部分が処理され、\ の次の1文字を二重で buf に追加してしまうことになる」の動作はしなそうですね。
(もしかすると、環境によって異なる場合があるかもしれませんが)

2022.05.23 16:32
返信投稿用フォームスパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
© 2010- 基本情報技術者試験ドットコム All Rights Reserved.

Pagetop